• 2018-08-20
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/08/django-with.html

Djangoのテンプレートタグ 「with」変数定義

日本一平凡なDjangoバナー

タグ「with」は、他の言語でもちょくちょく出てくる発想ですね。

テンプレート中で変数を別途定義するようなものです。

複雑な変数の代入

withの利便性はいくつかあります。
まずは長くて複雑な変数を短くするところから。

公式のサンプルにこんなソースがあります。

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

「business.employees.count」を何度も書くとテンプレートが長くなってしまうので、「total」という変数に一回代入することで綺麗にテンプレートが書けるわけです。

また「business.employees.count」は呼ばれる度にDBにアクセスして「select count(*)」をしているので、これを何度も実行するのは重いです。

withを使うことで一回実行してそれを変数に貯めておき、後はそれを使い回すという処理にすることで高速化出来るわけです。

地味ですが重要ですね。

定数定義

テンプレート中に定数を使用する場合、テンプレートの中に定数を挿入してしまうと保守性がイマイチになってしまいます。
withを使って定数を外出しっぽくしておくことも可能です。

{% with max=10 %}
    ...
    <p>最大{{max}}件まで表示しています。</p>
    ...
{% endwith %}

フィルターとの併用

実験してみたところ、どうやらwithはフィルターとも併用出来るようです。

{% with str="あいうえおかきくけこ" %}
{% with length=str|length %}
    ...
    <p>strの文字数は{{length}}です。</p>
    ...
{% endwith %}
{% endwith %}

応用次第で便利に使えそうです。

ただ、余りやり過ぎるとテンプレートの中で実装しているような感じになってしまいますからね。
ロジックを伴う処理はviews.pyで行い、テンプレートはあくまで見た目のHTMLであってロジックは入れないもの、というMVCモデルの基本を忘れないように使っていく必要がありそうです。

0 件のコメント:

コメントを投稿

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