Переопределение шаблонов ¶
В своем проекте вы можете захотеть переопределить шаблон в другом приложении Django, будь то стороннее приложение или приложение contrib, например django.contrib.admin
. Вы можете поместить переопределения шаблонов в каталог шаблонов вашего проекта или в каталог шаблонов приложения.
Если у вас есть каталоги шаблонов приложений и проектов, которые содержат переопределения, загрузчик шаблонов Django по умолчанию сначала попытается загрузить шаблон из каталога уровня проекта. Другими словами, DIRS
ищется раньше APP_DIRS
.
Смотрите также
Прочтите Переопределение встроенных шаблонов виджетов, если вы хотите это сделать.
Переопределение из каталога шаблонов проекта ¶
Сначала мы исследуем заменяющие шаблоны, создавая заменяющие шаблоны в каталоге шаблонов вашего проекта.
Допустим, вы пытаетесь переопределить шаблоны для стороннего приложения с именем blog
, которое предоставляет шаблоны blog/post.html
и
blog/list.html
. Соответствующие настройки для вашего проекта будут выглядеть так:
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,
...
},
]
Параметр TEMPLATES
и BASE_DIR
уже будет существовать, если вы создали свой проект с использованием шаблона проекта по умолчанию. Параметр, который необходимо изменить, - это 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
Если APP_DIRS
установлено значение True
, загрузчик шаблонов будет искать шаблоны в каталоге шаблонов приложения.
Расширение переопределенного шаблона ¶
Настроив загрузчики шаблонов, вы можете расширить шаблон с помощью
тега шаблона, в то же время переопределив его. Это может позволить вам вносить небольшие изменения без необходимости повторной реализации всего шаблона.{% 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
.
Этот метод работает, потому что загрузчик шаблона не учитывает уже загруженный шаблон переопределения (at templates/admin/base_site.html
) при разрешении extends
тега. В сочетании с block.super
этим - мощная техника для небольших настроек.