I am building a betting app where users can bet on different games. I want to show users' bets for different games in a table such as one as below:
game # | user 1 | user 2 | user 3
game 1 | XXXX | XXXX | XXXX
game 2 | XXXX | XXXX | XXXX
game 3 | XXXX | XXXX | XXXX
...
here's my view
users = User.objects.all()
games = Game.objects.all()
bets = Bet.objects.all()
user_bets = [[] for i in range(len(games))]
for i, game in enumerate(games):
game_bets = bets.filter(game=game)
for usr in users:
user_bet = game_bets.filter(user=usr)[0]
user_bets[i].append(user_bet)
data = {'games', games, 'users', users, 'user_bets': user_bets}
return render(request, 'bets.html', data)
But I don't know how to fill in the table using the 2d array user_bets. Any suggestions? Or if I'm doing the whole thing wrong any best practice to pass such data to template in Django?
Cheers
Passing Multi-dimensional arrays to templates in django is not straight forward. I've been working on this problem for a while, so I know your question is old, but for the betterment of django society, here's what I've finally worked out...
users = User.objects.all()
games = Game.objects.all()
bets = Bet.objects.all()
user_bets=[]
game_title=[]
for i, game in enumerate(games):
game_titles = [game.title]
game_bets = bets.filter(game=game)
for usr in users:
user_bet = game_bets.filter(user=usr)[0]
user_bets[i][usr.id]=user_bet
data = {'game_titles', game_titles 'users', users, 'user_bets': user_bets}
return render(request, 'bets.html', data)
You then want to define two template filters, which for ease can live in your views.py
@register.filter
def index(List, i):
return List[int(i)]
@register.filter
def entry_num_array(List):
return range(len(List))
Then in your template
{% for bet in user_bets %}
{{ game_titles|index:forloop.counter0}}:
{% for counter in entry|entry_num_array %}
{{entry|index:counter}}|
{% endfor %}
<br>
{% endfor %}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With