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

В своем проекте вы можете захотеть переопределить шаблон в другом приложении 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шаблон собственный логотип :

шаблоны / 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этим - мощная техника для небольших настроек.

Copyright ©2021 All rights reserved