Top / Programming / Python / Django TIPS / 他のテンプレートを読み込む

他のテンプレートを読み込む

サイドバーなど同じ部品を別のページで使用することはよくあることです。

ブログの記事の一覧表示も、新着記事の一覧やカテゴリー別の記事の一覧など、データは違っても表示するテンプレートは同じものを使います。

このように同じ要素を繰り返し使用するときは、includeタグを使用する方法と埋め込みタグを使用する方法があります。

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 %}

更新履歴