知識の枝

"All is well"

Django for文で2個ずつ取り出す

約104日前 2021年7月16日0:18
デジタル
Django

改訂履歴


2021/7/15 投稿

1. 背景


Djangoを使った開発中に覚えたことを備忘録として残します。

今回はhtmlテンプレート上のfor文で要素を2個ずつ取り出す方法を解説します。


2. ゴール


異なる2つのリストの要素を、1つのforループ内で取り出す。


3. はじめに


Djangoのhtmlテンプレート上でforループを書く場合
{% for item in list %}
{{item}}
{% endfor %}
とすることで、「list」の中の要素を順番に取り出すことが可能です。


さて、下記のような2つのリストがあったとします。
list_a = ["太郎", "次郎", "三郎", "四郎"]
list_b = ["東京", "神奈川", "群馬", "静岡"]


「太郎の出身は東京です。」
「次郎の出身は神奈川です。」
「三郎の出身は群馬です。」
「四郎の出身は静岡です。」

と出力したい場合、先ほどのfor文の書き方では難しそうですね。

1回のループの中で異なる2つのリストから1つずつ要素を取り出したいです。


Pythonの関数にはzip()というものがあり、上記のような用途にピッタリです。
for name, place in zip(list_a, list_b):
print(name + "の出身は" + place + "です。")
と書くだけで上記のように出力されます。


これと同じことをDjangoのhtmlテンプレート上で行いたい場合、
{% for name, place in zip(list_a, list_b) %}
<p>{{name}}の出身は{{place}}です。</p>
{% endfor %}
と書きたいところですが、エラーが出て思い通りにはなりません。

Djangoのhtmlテンプレート上でzip()と同じような動作を実行可能な方法を次項で解説します。



4. Django-Boostを使う


Djangoの標準機能では使うことができないPythonの組み込み関数を、htmlテンプレート上で使えるようにしてくれる便利なものがあります。

それが「Django-Boost」です。

公式サイトの手順にのっとり導入します。
https://django-boost.readthedocs.io/


4.1 - インストール


下記コマンドで「Django-Boost」をインストールしましょう。
pip install django-boost

インストールが終わったらsetting.pyの「INSTALLED_APPS 」に追加します。
INSTALLED_APPS = [
...
'django_boost',
]
導入作業はこれだけです!


4.2 - 実際に使ってみる


Django-Boostのテンプレートタグを使う際は、htmlファイルの中でアプリを読み込む必要があります。
html
{% load boost %}


zip関数の使い方は下記の通りです。
{% for name, place in list_a|zip:list_b %}
<p>{{name}}の出身は{{place}}です。</p>
{% endfor %}

これで2つのリストから同時に要素を取り出せるようになりました。


但し、本家のzip関数とは異なり、3つのリストを扱うことはできません。

どうしても必要であればカスタムテンプレートタグで作る必要があります。
それはまた別の機会に。


4.3 - 他には?


Django-Boostに実装されているpythonの組み込み関数は他にも沢山あります。
absallanyasciibin
boolcallablechrcomplexdelattr
dirdivmodenumeratefloatformat
getattrhasattrhashhexid
intlenmaxminnext
octordpowrangerepr
reversedroundsetattrsortedstr
sumtypevarszipzip_longest
chainvar

テンプレート内で使えると便利な関数もありますので、お試しあれ。

5. さいごに


今回紹介したDjango-Boostは2021年7月現在でDjango 3.2までサポートされています。

追加されたテンプレートタグはDjango-Boostの機能のほんの一部です。

他にも色々な機能があるようなので、もし興味があれば見てみると良いと思います。
Django-Boost

お疲れ様でした。