Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing a two dimensional array in Django template

Tags:

python

django

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

like image 518
Blademaster Avatar asked Sep 20 '26 23:09

Blademaster


1 Answers

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 %}
like image 58
talkingtoaj Avatar answered Sep 22 '26 12:09

talkingtoaj