Python入門 Djangoの使い方(その10)テンプレートの制御文(繰り返し処理)
はじめに
不定期連載のPython入門第24回目です。今回もPythonのWebフレームワーク「Django」を使っていきましょう。PythonのWebフレームワークといえばFlaskやPyramidなどもありますが、最も使われているのはDjangoです。今回はDjangoのテンプレート内での繰り返し処理の記述を学習していきます。それでは早速はじめましょう。
今回の内容:
テンプレートでのfor文の記述。
前提条件:
- Pythonバージョン:Python3
- Djangoバージョン:Django1.10.5
- 実行環境:Windows8
- ツール:VisualStudioCommunity2015
Djangoテンプレート内でのfor文サンプル
まずはシンプルな「for」文でリストの一覧を表示
'params': ["グー", "チョキ", "パー"]
上記リストを作成した場合、以下のように記述できます。
{% for p in params %} {{ p }} {% endfor %}
次にタプルの一覧を表示
'params': ("グー", "チョキ", "パー")
上記タプルを作成した場合も、リスト同様に以下のように記述できます。
{% for p in params %} {{ p }} {% endfor %}
次に辞書の一覧を表示
'params':{"a":"apple","b":"banana","c":"cherry"}
上記辞書を作成した場合、以下のように記述できます。
辞書はキーと値があるために、変数を2つ用意します。
{% for k,v in params.items %} {{ k }}{{ v }}<br> {% endfor %}
ここまでが基本のループ文ですね。
では次に少し応用バージョンを見ていきましょう。
リストの中身がない場合に別のメッセージを表示
{% for p in params %} {{ p }} {% empty %} params is empty. {% endfor %}
→paramsが空、未定義の場合、「params is empty」が表示されます。
リストの一部分を表示
sliceフィルタをつけることで、リストの一部を表示することができます。
{% for param in params|slice:"2:4" %} {{ param }} {% endfor %}
→リストのインデックスが2から3(4未満)まで表示されます。
{% for param in params|slice:"2:" %} {{ param }} {% endfor %}
→リストのインデックスが2以降が表示されます。
{% for param in params|slice:":4" %} {{ param }} {% endfor %}
→リストのインデックスが4未満が表示されます。
{% for param in params|slice:":" %} {{ param }} {% endfor %}
→リストが全部表示されます。
ループの最初だけ違う処理を行う。
{% for param in params|slice:":" %} {% if forloop.first %} This is first time. → {{ param }}<br> {% else %} {{ param }}<br> {% endif %} {% endfor %}
→最初のループのときだけ、「This is first time. →」が表示されます。
ループの最後だけ違う処理を行う。
{% for param in params|slice:":" %} {% if forloop.last %} This is last time. → {{ param }}<br> {% else %} {{ param }}<br> {% endif %} {% endfor %}
→最後のループのときだけ、「This is last time. →」が表示されます。
ループ内でループカウントを取得する。
{% for param in params %} index:{{ loop.counter0 }}/ count:{{ loop.counter }}/ value:{{ param }}<br> {% endfor %}
→「loop.counter0」が0からカウントアップするのでループするリストのインデックスとなる。
「loop.couter」は1からカウントアップするのでループした回数となる。
ループ内でループカウントの”逆”を取得する。
{% for param in params %} index:{{ loop.revcounter0 }}/ count:{{ loop.revcounter }}/ value:{{ param }}<br> {% endfor %}
→「loop.revcounter0」、「loop.revcouter」はそれぞれ「loop.counter0」、「loop.counter」の逆となる。
まとめ
今回はテンプレート内での繰り返し処理の制御構文を学習しました。DjangoではWhile文があるのか定かではありませんが、どうやらなさそうです。Pythonにはあるのですが。。ということで、繰り返し処理をテンプレート内で行い時にはfor文で書きましょう。上記に挙げたように「ある条件の時にはこの処理をする」といった記述もできますので、活用しましょう。