Django: テンプレートの検索順序とオーバーライド

2010年2月14日

Djangoのテンプレートは、{% extends "hoge.html" %}や{% include "hoge.html" %}などの タグと{{hogevar}}の変数と定数文字列からなっています。

テンプレートを理解する上でもう一つ重要なのが、テンプレートのオーバーライドです。 テンプレートはある規則に従ってファイルシステム内を検索されます。

#正確には、templatedbなどのDBベースのテンプレートデータも存在していますが。
オーバーライドをマスターすると、アプリごとにHTMLを変更したいものだけ別ディレクトリで管理する ことができるようになり、どれくらいの差分開発が発生したかを理解するのに役立ちます。


テンプレートはビューで指定します。

例えば以下のようなビューがあったとします。

1
2
3
from django.shortcuts import render_to_response 
def hoge(req): 
    return render_to_response("hoge.html", {})
この場合、Djangoはビューhogeが応答する際にhoge.htmlというテンプレートファイルを検索します。 検索する順番はsettings.pyにて定義されており、以下のような順番で検索が行われます。

  1. TEMPLATE_DIRS

    ユーザが自ら指定する検索ディレクトリへのパスのリストです。
    これはデフォルトでは空です。タプルで定義され、
    TEMPLATE_DIRS = (
    "/a/b/template/",
    "/a/template/",
    )
    などと定義すると、定義した順番でファイル検索が行われます。

  2. django.template.loaders.filesystem.load_template_source

    TEMPLATE_LOADERSにデフォルトで定義されているローダーです。 このローダーは、プロジェクト直下の「templates」というディレクトリがあった場合に、 そのディレクトリ内でテンプレートファイルを検索します。

  3. django.template.loaders.app_directories.load_template_source

    これもTEMPLATE_LOADERSにデフォルトで定義されているローダーです。 このローダーはINSTALLED_APPSにて登録されたアプリケーションディレクトリ直下の templatesディレクトリ以下を検索します。
    アプリケーションディレクトリは「./manage.py startapp app_name」にて作成した ディレクトリ: app_nameのことを指します。詳しくは、過去の記事をを参照してください。


DjangoはビューにてHTMLを出力する際に、指定されたhoge.htmlを上記1〜3の順番で探索します。 最初にhoge.htmlが見つかると検索処理はそこで終了し、レンダリング処理へと移行します。
これが理解できるようになると、Adminページの見栄えを変更したい場合などにも役に立ちます。 AdminページはINSTALLED_APPSの「django.contrib.admin」にて実装されています。 従って、アプリケーション名はadminです。なので、プロジェクトディレクトリ直下のtemplates 直下にtemplates/admin/ディレクトリを作成し、その下に変更したいファイルと同一のファイルを 配置すれば、Adminページを表示する際にそのテンプレートファイルを使ってレンダリングすることが できるようになります。これについては、次回また詳しく説明します。