2018年7月2日月曜日
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/07/if-truefalse-iftruefalse-if-param-true.html

Djangoのテンプレートタグ 「if」 分岐表現

今回のテーマは「if」タグ。
どんなプログラミングでも出てくるお約束です。

簡単ですがど忘れする部分もあるので記録しておきます。


True/False判定の仕様

そもそもifタグがどのようにTrue/Falseを判定しているのでしょうか?
例を挙げて説明します。

{% if param %}
   true
{% else %}
   false
{% endif %}

この定義の場合、

  • param が False の場合、False
  • param が Null,None の場合、False
  • param が "" の場合、False
  • それ以外がTrue

です。

だから変数に値が存在するかどうかは「{% if param %}」と書けば良いという意味です。

ちなみに、私は””(空白)がFalse扱いであることが気になります。

ならば””(空白)とNoneを別々に判定したい場合はどうすれば良いのか?

たぶん、この連載が終わる頃には分かると思うので少々お待ち下さい。
分かったら戻ってきます。

if,ifelse,else

if と else はそのままです。
else if ではなく elifであることが特徴です。

{% if param1 %}
    param1 が True
{% elif param2 %}
    param1 が False 、 param2 が True
{% else %}
    param1とparam2が両方False
{% endif %}


and と or

and と or の使い方は以下のとおり。

{% if param1 and param2 %}
    param1 と param2 が True
{% elif param1 or param2 %}
    param1 と param2 のどちらか一方だけ True
{% endif %}

括弧()は使えない

if文を書く時で厄介なのは、and と or が入り乱れる時ですね。

  • {% if param1 and param2 or param3 %}

など。
Djangoではandが先、orが後に解釈されるので、

  • if (param1 and param2) or param3

と同じ意味になりますが、Djangoのテンプレートで括弧は使えません。

だからand と or が入り乱れると意味不明になってしまうので、そういう場合はifタグを入れ子で書く方が良いでしょうね。

ただ、私としてはテンプレート側でifタグが入れ子になっているのは下手な実装だと思います。
そういう状況に追い込まれてしまったらview側で入れ子判定を行ってから結果をTemplateに渡すべきだと思いますね。

テンプレートで複雑な分岐、処理を行うべきではない。
これはデザインパターンの定石です。

ユニットテストや保守性で格段に違いがありますからね。

各種演算子

== 演算子、!= 演算子 等しい場合・等しくない場合

{% if param1 == 'X' %}
    param1 が X である
{% elif param1 != 'Y' %}
    param1 は X でも Y でもない
{% endif %}

< 演算子、<= 演算子、>演算子、>=演算子 大小比較

{% if param1 < 100 %}
    param1 が 100未満
{% elif param1 <= 100 %}
    param1 が 100以下
{% elif param2 > 100 %}
    param2 が 100より大きい
{% elif param1 >= 100 %}
    param2 が 100以上
{% endif %}

in 演算子、not in 演算子 含まれるかどうか

これは要注意。ちゃんとドキュメントを読んでいないと気付かない。

リストの中に対象の値が入っているかどうかを判定する演算子です。これを知らないとループを回したりする羽目になるので覚えておかねばなりません。

{% if "bc" in "abcdef" %}
  "abcdef" の中に "bc" が含まれている。
{% endif %}

{% if param1 in params %}
  paramsの中にparam1が含まれている。
{% endif %}

not が付くとその逆になります。

is 演算子、is not 演算子 True / Falseの判定

対象がTrue か False(None)かを判定するのに用います。

{% if param1 is True %}
  param1 が True
{% endif %}

{% if param1 is None %}
  param1 が False(None)
{% endif %}

{% if param1 is not True %}
  param1 が False(None)
  context.
{% endif %}

{% if param1 is not None %}
  param1 が True
{% endif %}


この演算子は余り使わない気がしますね。
「{% if param1  %}」 と 「{% if param1 is True %}」 は同じですから。


終わりに

以上です。
ifタグは頻繁に使うので暗記しておいた方が良いでしょう。

出展

公式サイトはこちら。


バックナンバー


0 件のコメント:

コメントを投稿

お気軽にコメント下さい。