テンプレートのオーバーライド
プロジェクトでは、サードパーティアプリケーションであろうと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テンプレートにカスタムロゴを追加できます。
テンプレート/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と組み合わせると、小さなカスタマイズを行うための強力な手法になります。