サイドバーなど同じ部品を別のページで使用することはよくあることです。
ブログの記事の一覧表示も、新着記事の一覧やカテゴリー別の記事の一覧など、データは違っても表示するテンプレートは同じものを使います。
このように同じ要素を繰り返し使用するときは、includeタグを使用する方法と埋め込みタグを使用する方法があります。
includeタグは任意のテンプレートをロードするためのタグです。
includeタグは引数にテンプレート名を受け取ります。
{% include テンプレート名 %}
次の例ではヘッダとフッタのテンプレートをロードしています。
<html>
<body>
{% include 'common/header.html' %}
…
{% include 'common/footer.html' %}
</body>
</html>
取り込まれたテンプレートは、取り込んだ側のコンテキストでレンダリングされます。
common/header.html
<p>こんにちは、{{ name }}さん。</p>
埋め込みタグのコードは、アプリケーション内のtemplatetags ディレクトリに配置します。
example/
├__init__.py
├manage.py
├settins.py
├urls.py
└bbs/
├__init__.py
├models.py
├views.py
└templatetags/ <- 埋め込みタグを配置するディレクトリ
├__init__.py <-パッケージ化に必要
└bbs_extras.py <-埋め込みタグを作成するモジュール
モジュールファイルの名前は、あとでタグをロードするときに使う名前にします。
他のアプリケーションのカスタムタグやフィルタと名前が衝突しないよう、よく注意して名前を決めます。
templatetagsディレクトリに作成したモジュール(bbs_extras.py)に埋め込みタグを作成します。
ここでは、すべてのEntryを出力するタグと、引数で渡されたEntryを出力するタグを作成します。
# -*- coding: utf-8 -*-
from django import template
from example.bbs.models import Entry
register = template.Library()
@register.inclusion_tag('bbs/extras/show_all_entries.html')
def show_all_entries():
'''すべてのEntryを出力する埋め込みタグ'''
return {'entries': Entry.objects.all()}
@register.inclusion_tag('bbs/extras/show_entries.html')
def show_entries(entries):
'''引数で渡されたEntryを出力する埋め込みタグ'''
return {'entries': entries}
一つずつ見ていきましょう。
@register.inclusion_tag('bbs/extras/show_all_entries.html')
このデコレータは埋め込みタグを作成して、作成したタグをLibraryに登録します。
inclusion_tag()の引数は、テンプレートファイルを指定します。
def show_all_entries():
'''すべてのEntryを出力する埋め込みタグ'''
return {'entries': Entry.objects.all()}
埋め込みタグの関数は辞書を返します。
埋め込みタグで使用するテンプレートを作成します。
埋め込みタグで使用するテンプレートは、埋め込みタグのデコレータで指定しました。
@register.inclusion_tag(テンプレートファイル名)
指定した場所にファイルを作成して編集します。
今回の例では、settings.pyでテンプレートの配置ディレクトリを次のように指定しました。
import os
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'templates')
)
埋め込みタグを作成するときにテンプレートファイルを'bbs/extras/show_entries.html'と指定していますので、次のように配置します。
example/
├bbs/
└templates/
└bbs
└extras/
└show_entries.html <-このファイルを作成
同様にshow_all_entries.htmlも作成します。
example/
├bbs/
└templates/
└bbs
└extras/
├show_all_entries.html <-このファイルを作成
└show_entries.html
今回作成するサンプルでは、テンプレートファイルの内容はshow_all_entries.htmlもshow_entries.htmlも同じです。
埋め込みタグの関数が返す辞書のデータを使用します。
<ul>
{% for entry in entries %}
<li>{{ entry.name }}</li>
{% endfor %}
</ul>
作成した埋め込みタグを使ってみましょう。
モジュールを読み込みます。
{% load bbs_extras %}
引数のない埋め込みタグは、変数の出力と同じように使用できます。
{% show_all_entries %}
引数のある埋め込みタグは、引数をスペース区切りで指定します。
{% show_entries entries %}