テンプレートのオーバーライド
プロジェクトでは、サードパーティアプリケーションであろうとdjango.contrib.admin
などの寄稿アプリケーションであろうと、別のDjangoアプリケーションのテンプレートをオーバーライドしたい場合があります。 テンプレートオーバーライドは、プロジェクトのテンプレートディレクトリまたはアプリケーションのテンプレートディレクトリに配置できます。
両方にオーバーライドが含まれているアプリとプロジェクトのテンプレートディレクトリがある場合、デフォルトのDjangoテンプレートローダーは最初にプロジェクトレベルのディレクトリからテンプレートを読み込もうとします。 言い換えると、 :setting: `DIRS ` 前に検索されます :setting: `APP_DIRS ` 。
プロジェクトのテンプレートディレクトリからオーバーライドする
まず、プロジェクトのテンプレートディレクトリに置換テンプレートを作成して、テンプレートをオーバーライドする方法について説明します。
テンプレートblog/post.html
およびblog/list.html
を提供するblog
と呼ばれるサードパーティアプリケーションのテンプレートをオーバーライドしようとしているとしましょう。 プロジェクトに関連する設定は次のようになります。
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
INSTALLED_APPS = [
...,
'blog',
...,
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
...
},
]
デフォルトのプロジェクトテンプレートを使用してプロジェクトを作成した場合、:setting: `TEMPLATES` 設定とBASE_DIR
はすでに存在します。 変更が必要な設定は :setting: `DIRS ` 。
これらの設定は、プロジェクトのルートにtemplates
ディレクトリがあることを前提としています。 blog
アプリのテンプレートを上書きするには、templates
ディレクトリにフォルダーを作成し、そのフォルダーにテンプレートファイルを追加します。
templates/
blog/
list.html
post.html
テンプレートローダーは、最初にDIRS
ディレクトリでテンプレートを探します。 blog
アプリのビューがblog/post.html
およびblog/list.html
テンプレートを要求すると、ローダーは作成したファイルを返します。
アプリのテンプレートディレクトリからのオーバーライド
プロジェクトのアプリの外部にあるテンプレートをオーバーライドするため、最初の方法を使用して、プロジェクトのテンプレートフォルダーにテンプレートオーバーライドを配置するのが一般的です。 ただし、必要に応じて、アプリのテンプレートディレクトリにオーバーライドを配置することもできます。
まず、テンプレート設定がアプリディレクトリ内をチェックしていることを確認します。
TEMPLATES = [
{
...,
'APP_DIRS': True,
...
},
]
テンプレートオーバーライドをmyapp
というアプリに配置し、オーバーライドするテンプレートの名前がblog/list.html
およびblog/post.html
の場合、ディレクトリ構造は次のようになります。
myapp/
templates/
blog/
list.html
post.html
と :setting: `APP_DIRS ` に設定True
、テンプレートローダーはアプリのテンプレートディレクトリを調べてテンプレートを見つけます。
オーバーライドされたテンプレートの拡張
テンプレートローダーを構成すると、を使用してテンプレートを拡張できます。 :ttag: `{%extends%} ` テンプレートタグと同時にオーバーライドします。 これにより、テンプレート全体を再実装しなくても、小さなカスタマイズを行うことができます。
たとえば、この手法を使用して、admin/base_site.html
テンプレートにカスタムロゴを追加できます。
{% extends "admin/base_site.html" %} {% block branding %} <img src="link/to/logo.png" alt="logo"> {{ block.super }} {% endblock %}
注意すべき重要なポイント:
- この例では、構成されたプロジェクトレベルの
templates
ディレクトリを使用してadmin/base_site.html
をオーバーライドするファイルをtemplates/admin/base_site.html
に作成します。 - 新しいテンプレートは
admin/base_site.html
を拡張します。これは、オーバーライドされているのと同じテンプレートです。 - テンプレートは
branding
ブロックのみを置き換え、カスタムロゴを追加し、block.super
を使用して前のコンテンツを保持します。 - テンプレートの残りの部分は、
admin/base_site.html
から変更されずに継承されます。
この手法が機能するのは、extends
タグを解決するときに、テンプレートローダーが(templates/admin/base_site.html
にある)すでにロードされているオーバーライドテンプレートを考慮しないためです。 block.super
と組み合わせると、小さなカスタマイズを行うための強力な手法になります。