Django Templateのif-elseを短く書く
Bootstrap.cssとDjangoのテンプレートエンジンを組み合わせて利用していると
{% if param.status == 1 %}
<!-- 特定の条件の場合activeというクラス名をつける -->
<li class="active">
{% else %}
<li>
{% endif %}
<a href="#">Active</a>
</li>
……
みたいに書かなくてはならない時があります。
インデントはややこしくなるし、
たったこれだけの処理に何行も費やすのは見難いです。
そこでどうかけば短く書けるのか探してみたところ、
「yesno」という組み込みフィルタを見つけました。
https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#yesno
このフィルタはカンマ区切りの文字列を引数に取ります。
値がTrueと解釈できるなら 引数の最初からカンマまでを、
値がFalseと解釈できるなら、最初から2つめのカンマまでを、
そして値がNoneなら、2つめのカンマから後ろを返してくれます。
(Noneはオプションです)
{{ value|yesno "はい,いいえ,なし" }}
とすれば、
値がTrueの時(例: 「1」「"hoge"」なんかもOK)の時 「はい」に、
値がFalseの時(例:「0」「""])の時は「いいえ」になります。
この面白いフィルタを使って上のテンプレートを書き換えると
<!-- 特定の条件の場合activeというクラス名をつける -->
<li class="{{ param.status|yesno:'active,' }}">
<a href="#">Active</a>
</li>
となります。
一行が長くなってしまいますが、前の書き方より
インデントの構造がスッキリして見やすくなるのでメリットが大きいです。