Перегрузка шаблонов ¶
В своем проекте вы можете захотеть переопределить шаблон из другого приложения 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(strict=True).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
этим - мощная техника для небольших настроек.