Spec-Zone.ru › Django 3.1

Переопределение шаблонов

В вашем проекте вы, возможно, захотите переопределить шаблон в другом приложении Django, будь то приложение сторонних разработчиков или приложение contrib, например django.contrib.admin. Вы можете поместить переопределения шаблонов в директорию templates вашего проекта или в директорию templates приложения.

Если у вас есть директории шаблонов приложения и проекта, которые оба содержат переопределения, стандартный загрузчик шаблонов 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 это мощный метод для внесения небольших изменений.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.1/howto/overriding-templates/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API