在您的项目中,您可能需要覆盖另一个Django应用程序中的模板,无论是第三方应用程序还是contrib应用程序,如django.contrib.admin
。 您可以将模板替换放在项目的templates目录或应用程序的templates目录中。
如果您有包含覆盖的应用程序和项目模板目录,则默认的Django模板加载程序将尝试首先从项目级目录加载模板。 换句话说,在APP_DIRS
之前搜索DIRS
。
首先,我们将通过在项目的templates目录中创建替换模板来探索覆盖模板。
假设您尝试覆盖名为blog
的第三方应用程序的模板,该应用程序提供模板blog/post.html
和blog/list.html
您的项目的相关设置如下所示:
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,
...
},
]
如果使用默认项目模板创建项目,则TEMPLATES
设置和BASE_DIR
将已存在。 需要修改的设置是DIRS
。
这些设置假设您的项目根目录中有一个templates
目录。 要覆盖blog
应用程序的模板,请在templates
目录中创建一个文件夹,并将模板文件添加到该文件夹中:
templates/
blog/
list.html
post.html
模板加载程序首先在DIRS
目录中查找模板。 当blog
应用程序中的视图请求blog/post.html
和blog/list.html
模板时,加载程序将返回文件你刚刚创建
由于您覆盖了一个项目的应用程序之外的模板,因此使用第一种方法并将模板替换放在项目的templates文件夹中更为常见。 但是,如果您愿意,也可以将覆盖放在应用程序的模板目录中。
首先,确保您的模板设置检查应用程序目录:
TEMPLATES = [
{
...,
'APP_DIRS': True,
...
},
]
如果您想将模板替换放在名为myapp
的应用程序中,并覆盖的模板名为blog/list.html
和blog/post.html
myapp/
templates/
blog/
list.html
post.html
将APP_DIRS
设置为True
,模板加载器将在应用程序的templates目录中查找并查找模板。
2017年9月6日