Перегрузка шаблонов

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

шаблоны / 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 ©2020 All rights reserved