Django: шаблон в зависимости от режима отладки

Хочу привести рецепт того, как с помощью создания собственного шаблонного тега заставить меняться шаблон в зависимости от режима отладки.

Режимом отладки управляет переменная DEBUG в файле settings.py. Если DEBUG == True, то Django выводит отладочную информацию при возникновении ошибок.

Отладка должна быть выключена на боевом сервере и включена на сервере разработки. Это правило можно использовать, чтобы на основании переменной DEBUG, определять на каком сервере мы находимся.

В Django генерацией страниц из шаблонов занимаются представления. Представим ситуацию, когда есть базовый шаблон, использующийся во множестве представлений, и понадобилось изменять шаблон в зависимости от какого-то условия. Править все представления слишком муторно и можно что-нибудь пропустить. Тогда на помощь приходят собственные теги.

При написании статьи я использовал Django версии 1.8.

Собственный тег можно определить только в приложении, поэтому создадим приложение app_for_template_tags командой:

python3 manage.py startapp app_for_template_tags

Приложение необходимо добавить в INSTALLED_APPS в файле settings.py:

INSTALLED_APPS = (
    # Другие приложения,
    'app_for_template_tags',
)

Теги должны определяться в пакете templatetags, поэтому надо создать папку templatetags с пустым файлом __init__.py в каталоге app_for_template_tags.

Создадим модуль в котором будет определение тега. Пусть модуль называется debug_mode_tag.py.

Содержимое debug_mode_tag.py:

from django import template
from django.conf import settings

register = template.Library()

@register.assignment_tag
def debug_mode_tag():
     return settings.DEBUG

Имя функции debug_mode_tag соответствует имени нового тега. Имя файла не обязательно должно совпадать с именем функции. Кроме того функций может быть несколько.

Если разработка ведется на сервере разработчика и включен режим отладки, то функция debug_mode_tag вернет True, иначе False.

В шаблоне тег используется следующим образом:

{% load debug_mode_tag %}

{% debug_mode_tag as debug_mode %}

{% if debug_mode %}
  <!-- Html-код, который будет
  показан, если включена отладка. -->
{% endif %}

В первой строке подключается модуль debug_mode_tag. Во второй строке создается переменная debug_mode, значение которой будет равно значению, которое вернула функция debug_mode_tag.

Итог

Для решения понадобилось создать файловую структуру:

Django тег debug_mode_tag

Создать функцию в модуле debug_mode_tag.py и добавить приложение в settings.py.

Подробное описание создания тегов можно почитать в документации на Django.

-->
X
Обратный звонок