32
26

More than 5 years have passed since last update.

Django Templateのif-elseを短く書く

Posted at

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>

となります。
一行が長くなってしまいますが、前の書き方より
インデントの構造がスッキリして見やすくなるのでメリットが大きいです。

32
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
26