Overriding templates¶
В своем проекте вы можете захотеть переопределить шаблон в каком-либо приложении 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:
templates/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.
Этот метод работает, потому что загрузчик шаблонов не учитывает уже загруженный шаблон переопределения (в templates/admin/base_site.html) при разрешении тега extends. В сочетании с block.super это мощный метод для выполнения небольших настроек.