基本形
文法
for
タグで始め、endfor
タグで終える。for
タグの書き方はPythonのfor
文と同じ。
1 2 3 |
{% for in .... %} .... {% endfor %} |
コレクションに対する操作の殆どはPythonと同じ。
リスト
リストの内容を順次取り出す例。
1 2 3 4 5 |
def for_tag(request): context = { 'medals': ['Gold', 'Silver', 'Bronze'], } return render(request, 'dtldemo/for_tag.html', context) |
1 2 3 4 5 6 |
<p>メダル</p> <ol> {% for medal in medals %} <li>{{ medal }} medal</li> {% endfor %} </ol> |
メダル
- Gold medal
- Silver medal
- Bronze medal
アンパック
1 2 3 4 5 |
def for_tag(request): context = { 'dices': [[1, 3], [3, 3], [4, 2]], } return render(request, 'dtldemo/for_tag.html', context) |
1 2 3 4 5 6 |
<p> サイコロ: {% for dice1, dice2 in dices %} ({{ dice1 }}, {{ dice2 }}) {% endfor %} </p> |
辞書
辞書のキーと値を取り出す例。Pythonと同じで.items
を付ける。
1 2 3 4 5 |
def for_tag(request): context = { 'capitals': {'Japan': 'Tokyo', 'France': 'Paris', 'US': 'WDC'} } return render(request, 'dtldemo/for_tag.html', context) |
1 2 3 4 5 6 |
<p>首都</p> <ul> {% for key, value in capitals.items %} <li>Country: {{ key }} - Capital: {{ value }}</li> {% endfor %} </ul> |
首都
- Country: Japan – Capital: Tokyo
- Country: France – Capital: Paris
- Country: US – Capital: WDC
注意点
for ... in
の後には関数やリテラルは書けず、range
やzip
、enumerate
はエラーになる。ただしリテラルは書けないが、view関数内で変数に代入しておけば実行可能。以下はrange
の例。
1 2 3 4 |
context = { 'var_range': range(5), } return render(request, 'dtldemo/for_tag.html', context) |
1 2 3 |
{% for i in var_range %} <p>{{ i }}</p> {% endfor %} |
zip
やenumerate
についても、view関数側で変数に代入しておけば使える。なおenumerate
については、forloop
変数にカウンターが用意されている。
empty~変数が空の場合
{% empty %}
タグは{% for %}~{% endfor %}
の間に入れる。for
で使う変数が空の場合にループを実行せず、empty
以下が実行されてループを終わる。
1 2 3 4 5 |
{% for .... in var $} ループ処理 {% empty %} 空の場合の処理 {% endfor %} |
変数の内容が以下の場合にempty
ブロックが実行される。
- 未定義
None
[]
()
''
reversed~逆順
for
タグにreversed
を付すと、c
の内容が逆順でe
に取り出される。
1 2 3 |
{% for e in c reversed %} .... {% endfor %} |
forloop変数
一覧
forloop
変数によって、ループ中でカウンター値やループの先頭・末尾データなどを得ることができる。
forloop.counter |
ループカウンター値(初期値:1) |
forloop.counter0 |
ループカウンター値(初期値:0) |
forloop.revcounter |
逆順カウンター値(終了値:1) |
forloop.revcounter0 |
逆順カウンター値(終了置:0) |
forloop.first |
最初のループならTrue |
forloop.last |
最後のループならTrue |
forloop.parentloop |
多重ループの外側の値 |
カウンター
以下はrevcounter0
の例。
1 2 3 4 5 |
def for_tag(request): context = { 'countdown': ['three', 'two', 'one', 'zero!'], } return render(request, 'dtldemo/for_tag.html', context) |
1 2 3 4 5 6 |
<p>countdown</p> <ul> {% for c in countdown %} <li>{{ forloop.revcounter0 }}-{{ c }}</li> {% endfor %} </ul> |
countdown
- 3-three
- 2-two
- 1-one
- 0-zero!
first/last~最初/最後のループ判定
forloop.first
、forloop.last
は最初や末尾のループだけ別の処理をさせたいときに便利。
1 2 3 4 5 |
def for_tag(request): context = { 'firstlast': [1, 2, 3, 4], } return render(request, 'dtldemo/for_tag.html', context) |
1 2 3 4 5 6 7 8 9 10 11 12 |
<p>first and last</p> <p> {% for i in firstlast %} {% if forloop.first %} <{{ i }}, {% elif forloop.last %} {{ i }}> {% else %} {{ i }}, {% endif %} {% endfor %} </p> |
first and last
<1, 2, 3, 4>
この例では、最初の要素の前に'<'
を出力し、最後の要素の後ろにカンマを付けずに'>'
を出力する。
parentloop~親ループ
foroop.parentloop
は言わば「親ループの~」という意味で、この後にcounter
やfirst
などを付けて親ループの値を参照する。たとえば、
forloop.parentloop.counter
:親ループの現在のカウンター値forloop.parentloop.first
:親ループが現在最初のループ中ならTrue
たとえば以下の例では、二重ループを回しながら、一番最初の行の先頭要素の前と一番最後の行の末尾要素の後に別の文字を出力させている。
1 2 3 4 5 |
def for_tag(request): context = { 'digits': [1, 2, 3], } return render(request, 'dtldemo/for_tag.html', context) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<p>parentloop</p> <code> {% for i in digits %} {% for j in digits %} {% if forloop.parentloop.first and forloop.first %} < {% endif %} {{ i }}-{{ j }} {% if forloop.parentloop.last and forloop.last %} > {% endif %} {% endfor %} <br> {% endfor %} </code> |
parentloop
< 1-1 1-2 1-3
2-1 2-2 2-3
3-1 3-2 3-3 >