Spec-Zone.ru › Django 5.0

Как переопределять шаблоны

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

Сначала убедитесь, что ваши настройки шаблонов проверяют каталоги приложений:

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/5.0/howto/overriding-templates/

Spec-Zone.ru

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