python

djangoテンプレートで2つの配列を同時にループさせる

2020-10-26

通常、pythonで2つの配列を同時にループさせる場合は

for a, b in zip(list_a, list_b):
    print f'a = {a}, b = {b}'

と言った記述でできる。

でも、Djangoのデフォルトテンプレートでこれをやろうとすると、できない。(Jinja2ならできる)
本当にエレガントに記述しようとすると、独自のタグを作らないといけない。

とはいえ何でもかんでもタグを作り始めるとキリがない。
頭をひねった結果、次のような感じにしたらしっくりきた。

# view
list_a = ['a', 'b', 'c']
list_b = [1, 2, 3]

list_b.reverse()
# template
{% for a in list_a %}
    {{ list_b.pop }}
{% endfor %}

1つの配列でループして、もう1つの配列はpop()で要素を1つずつ取り出していく考え方。

2回以上pop()してしまうとダメだけど、そこさえ注意すれば簡潔に記述できる。

後日追記

2020.10.29追記

viewのテストでレスポンスをチェックする時に、{{ list_b.pop }}により要素を全て取り出しているため、取り出した分だけ配列の要素がなくなった状態になっているため注意。

原因がわからず2時間もの間Djangoのソースを追うハメになった。

-python

© 2022 ヂまるBlog