テンプレートのオーバーライド
プロジェクトでは、サードパーティアプリケーションであろうとdjango.contrib.admin
などの寄稿アプリケーションであろうと、別のDjangoアプリケーションのテンプレートをオーバーライドしたい場合があります。 テンプレートオーバーライドは、プロジェクトのテンプレートディレクトリまたはアプリケーションのテンプレートディレクトリに配置できます。
両方にオーバーライドが含まれているアプリとプロジェクトのテンプレートディレクトリがある場合、デフォルトのDjangoテンプレートローダーは最初にプロジェクトレベルのディレクトリからテンプレートを読み込もうとします。 言い換えると、 :setting: `DIRS ` 前に検索されます :setting: `APP_DIRS ` 。
プロジェクトのテンプレートディレクトリからオーバーライドする
まず、プロジェクトのテンプレートディレクトリに置換テンプレートを作成して、テンプレートをオーバーライドする方法について説明します。
テンプレートblog/post.html
およびblog/list.html
を提供するblog
と呼ばれるサードパーティアプリケーションのテンプレートをオーバーライドしようとしているとしましょう。 プロジェクトに関連する設定は次のようになります。
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
INSTALLED_APPS = [
...,
'blog',
...,
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(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
、テンプレートローダーはアプリのテンプレートディレクトリを調べてテンプレートを見つけます。