覆盖模板

在您的项目中,您可能需要覆盖另一个Django应用程序中的模板,无论是第三方应用程序还是contrib应用程序,如django.contrib.admin 您可以将模板替换放在项目的templates目录或应用程序的templates目录中。

如果您有包含覆盖的应用程序和项目模板目录,则默认的Django模板加载程序将尝试首先从项目级目录加载模板。 换句话说,在APP_DIRS之前搜索DIRS

覆盖项目的模板目录

首先,我们将通过在项目的templates目录中创建替换模板来探索覆盖模板。

假设您尝试覆盖名为blog的第三方应用程序的模板,该应用程序提供模板blog/post.htmlblog/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.htmlblog/list.html模板时,加载程序将返回文件你刚刚创建

从app的模板目录覆盖

由于您覆盖了一个项目的应用程序之外的模板,因此使用第一种方法并将模板替换放在项目的templates文件夹中更为常见。 但是,如果您愿意,也可以将覆盖放在应用程序的模板目录中。

首先,确保您的模板设置检查应用程序目录:

TEMPLATES = [
    {
        ...,
        'APP_DIRS': True,
        ...
    },
]

如果您想将模板替换放在名为myapp的应用程序中,并覆盖的模板名为blog/list.htmlblog/post.html

myapp/
    templates/
        blog/
            list.html
            post.html

APP_DIRS设置为True,模板加载器将在应用程序的templates目录中查找并查找模板。