• 2018-07-05
ウズマスター戦記
ウズマスター戦記 https://www.uzumax.org/2018/07/django-include.html

Djangoのテンプレートタグ 「include」 部品化したテンプレートを読み込み

Djangoには「include」は別のテンプレートをこっちのテンプレートに読み込むものです。
複数個所で同じHTMLを出力する場合にテンプレートを共有する手段として便利です。

その名のとおり、現在日時を表示するタグです。

テンプレートの共通化という意味では「extends」と似ていますが、extendsはテンプレートの継承。
「include」は部品の読み込みというイメージです。



呼び出し元の書き方

includeを説明する為には二つの部品が登場します。
呼び出し元となる本体テンプレートと、呼び出される部品テンプレートです。

includeを使うのは呼び出し元の方ですので、以下のように記述します。

tag_samples/tagincludebody.html

{% include "tag_samples/parts.html" %}

呼び出される側は普通に書く

呼び出される部品側は、部品の役割を果たす部分だけを書くことになります。

tag_samples/parts.html

私の名前は{{ name }}です。<br/>
年齢は{{age}}です。<br/>
趣味は{{hoby}}です。


これで画面には以下のように表示されることになります。

変数部分はそれぞれ以下が入っています。

  • {name}:ウズマスター
  • {age}:35
  • {hoby}:ブログ執筆

結果、画面には以下のように表示されるというわけです。


グローバル変数状態

ここで気になる点としては、部品として呼び出されるparts.html側には、特に引数は渡していないということです。

にも拘わらず、画面には普通に表示される。

つまり、{name}などの変数は親画面からグローバル変数みたいに渡っているということです。

withで引数を渡す

では、グローバル変数方式ではなく、引数でパラメータを渡したい場合はどうするか?
それにはwithを使用します。

tag_samples/tagincludebody.html

{% include "tag_samples/parts.html" with name="ウズにゃん" age=99 %}

結果、以下のように引数で渡した部分は元々のcontextが上書きされて表示されます。
でも引数で渡していない「ブログ執筆」はそのままですね。


onlyで完全ローカル変数化

「include」には「only」というパラメータもあります。
これはグローバル変数式に値を読み込むことを禁止する機能です。

tag_samples/tagincludebody.html

{% include "tag_samples/parts.html" with name="ウズにゃん" age=99 only %}

こうするとグローバルで渡っていた「{{hoby}}」が無効化されますので、以下のように表示されます。


{{hoby}}の箇所が空白になっちゃった。

withで変数を引数で渡す

では、onlyを使うことで品質に問題を生じやすいグローバル機能を封印しつつ、値としてはコンテキストの値をそのまま部品側に流し込みたい場合はどう書けば良いか?

それはこれだ!!

tag_samples/tagincludebody.html

{% include "tag_samples/parts.html" with name="ウズにゃん" age=99 hoby=hoby only %}

「hoby=hoby」で、コンテキスト「hoby」の値がローカル変数的に渡りました。


書き方を知っていれば簡単です。

終わりに

共通部品化出来るものは積極的に部品化していきましょう。

出展

公式サイトはこちら。


バックナンバー

0 件のコメント:

コメントを投稿

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