今回のお題
今回のお題は条件分岐です。
djangoテンプレートの条件分岐処理はpythonのそれとは勝手が違う部分がいくつかあるのでそこに関してまとめます。
繰り返し処理でも似たような試みをしているのでよろしければどうぞ。
目次
- and, orについて
- yesnoフィルター
- firstof
and, orについて
djangoテンプレートのandとorはandを先に処理する
というルールが決まっており、かつ()で無理矢理順番を変えることはできません。
なので、orを先に処理して欲しければif文をネストさせることになります。
{% if x % 2 == 0 or y == 10 and z != 0 %}
<!-- 上記は次のものと等価 -->
if x % 2 == 0 or (y == 10 and z != 0):
if (x % 2 == 0 or y == 10) and z != 0:
<!-- ↑のようにしたければ↓のように書く -->
{% if y == 10 and z != 0 %}
{% if x % 2 == 0 %}
また、10 < x < 30
のような書き方もできません。
if 10 < x < 30:
# これは次のように書く
{% if x > 10 and x < 30 %}
yesnoフィルター
yesnoフィルターを用いると、対象の値がtrue
, false
, none
のいずれかによって表示する値を変えることができます。
{{ is_teacher?|yesno:"教師,生徒,部外者" }}
上記の例であれば、is_teacher?
という変数の真偽値に応じて教師・生徒・部外者のいずれかが出力されるようになっています。
なお、Noneの場合の値を省略した場合には、Noneの場合もfalseの値が表示されます。
firstof
{% first 値1 値2 ... 値n %}
とすることで、falseではない最初の値を出力します。
値1 ~ 値nに関しては変数とそれ以外を混ぜることができるので、
{% firstof 変数1 変数2 ... 変数n "文字列" %}
のようにしておけば、変数が全てfalseもしくはivewsから与えられていない場合には"文字列"を出力する
というようにすることもできます。
終わりに
以上、djangoに特有の(pythonにはない)条件分岐処理についてまとめました。
慣れるのが若干大変ですが、うまく使いこなせればコードが楽に描けるようになるので早く身につけたいですね。