Открыть сервис

Django Template Language

Django Template Language (DTL) — это встроенный шаблонизатор веб-фреймворка Django, предназначенный для генерации HTML-кода и других текстовых форматов на стороне сервера. DTL позволяет отделить логику представления данных от бизнес-логики приложения, предоставляя разработчикам набор тегов, фильтров и переменных для динамического формирования контента. Шаблонизатор является частью стандартной библиотеки Django и не требует установки дополнительных зависимостей.

История

Django Template Language был создан в 2005 году в рамках разработки веб-фреймворка Django, изначально созданного для управления новостным сайтом Lawrence Journal-World. Основной целью DTL было обеспечение простого и безопасного способа вставки динамических данных в HTML-шаблоны без возможности выполнения произвольного кода Python. В отличие от более мощных, но потенциально опасных шаблонизаторов (например, Mako или Jinja2), DTL изначально проектировался с ограниченным набором возможностей, чтобы предотвратить случайное или злонамеренное выполнение серверного кода в шаблонах.

С выходом Django 1.0 в 2008 году DTL стал стабильным компонентом фреймворка. В последующих версиях (1.8, 1.11, 2.0, 3.0, 4.0, 5.0) шаблонизатор постепенно расширялся: появились поддержка наследования шаблонов, встроенные теги для циклов и условий, улучшенная обработка контекста, а также возможность использования пользовательских тегов и фильтров. В Django 1.8 была добавлена поддержка нескольких шаблонизаторов, что позволило использовать Jinja2 наряду с DTL. Несмотря на это, DTL остаётся шаблонизатором по умолчанию и рекомендуется для большинства проектов на Django.

Архитектура и принципы работы

DTL работает на основе шаблонов — текстовых файлов (обычно с расширением .html), содержащих статический контент и специальные конструкции — переменные, теги и фильтры. При обработке запроса Django загружает шаблон, подставляет в него данные из контекста (словаря Python) и возвращает готовую строку (чаще всего HTML-код).

Переменные

Переменные в DTL обозначаются двойными фигурными скобками: {{ переменная }}. Они могут содержать простые значения (строки, числа, булевы значения), а также атрибуты объектов или элементы словарей/списков, доступ к которым осуществляется через точку: {{ user.name }} или {{ item.0 }}. Если переменная не найдена в контексте, DTL по умолчанию возвращает пустую строку (настройка TEMPLATE_STRING_IF_INVALID).

Фильтры

Фильтры применяются к переменным для изменения их отображения. Синтаксис: {{ переменная|фильтр }}. Фильтры могут принимать аргументы: {{ переменная|фильтр:"аргумент" }}. Некоторые встроенные фильтры:

  • date — форматирование даты ({{ value|date:"Y-m-d" }}).
  • default — значение по умолчанию, если переменная пуста ({{ value|default:"ничего" }}).
  • length — длина строки или списка ({{ list|length }}).
  • upper / lowerпреобразование регистра.
  • safe — отключение экранирования HTML (используется с осторожностью).
  • truncatewords — обрезка текста до указанного количества слов.

Фильтры можно комбинировать: {{ value|lower|truncatewords:10 }}.

Теги

Теги — это конструкции, управляющие логикой шаблона. Они обрамляются в {% %}. Основные встроенные теги:

  • {% if %}, {% elif %}, {% else %}, {% endif %} — условный вывод.
  • {% for %}, {% endfor %} — цикл по последовательности.
  • {% block %}, {% endblock %} — определение блоков для наследования.
  • {% extends %} — указание родительского шаблона.
  • {% include %} — вставка другого шаблона.
  • {% url %} — генерация URL по имени маршрута.
  • {% csrf_token %} — вставка токена CSRF для защиты форм.
  • {% load %} — загрузка пользовательских тегов или фильтров из библиотеки.

Пример использования тегов:

``django {% if user.is_authenticated %} <p>Привет, {{ user.username }}!</p> {% else %} <p>Пожалуйста, войдите.</p> {% endif %} ``

Комментарии

Комментарии в DTL пишутся в фигурных скобках с решёткой: {# это комментарий #}. Они не отображаются в конечном HTML.

Наследование шаблонов

Одной из ключевых особенностей DTL является механизм наследования шаблонов. Он позволяет создать базовый шаблон (скелет страницы) с блоками, которые затем переопределяются в дочерних шаблонах. Это уменьшает дублирование кода и упрощает поддержку.

Базовый шаблон (base.html):

``django <!DOCTYPE html> <html> <head> <title>{% block title %}Мой сайт{% endblock %}</title> </head> <body> <header>{% block header %}Шапка сайта{% endblock %}</header> <main>{% block content %}{% endblock %}</main> <footer>{% block footer %}Подвал{% endblock %}</footer> </body> </html> ``

Дочерний шаблон (page.html):

``django {% extends "base.html" %} {% block title %}Главная страница{% endblock %} {% block content %} <h1>Добро пожаловать!</h1> <p>Это главная страница.</p> {% endblock %} ``

При рендеринге page.html будет вставлен в базовый шаблон, заменяя соответствующие блоки. Блоки, не переопределённые в дочернем шаблоне, сохраняют содержимое из базового.

Пользовательские теги и фильтры

Разработчик может создавать собственные теги и фильтры, размещая их в файле templatetags внутри приложения Django. Для этого используется модуль template из библиотеки Django. Пользовательские теги бывают простыми (возвращают строку) и включениями (рендерят другой шаблон). Фильтры — это функции, принимающие значение и опционально аргумент.

Пример простого пользовательского фильтра (myapp/templatetags/my_filters.py):

```python from django import template

register = template.Library()

@register.filter def multiply(value, arg): return value * arg ```

В шаблоне:

``django {% load my_filters %} {{ 5|multiply:3 }} {# выведет 15 #} ``

Отличия от Jinja2

Хотя DTL и Jinja2 (другой популярный шаблонизатор для Python) имеют схожий синтаксис, между ними есть принципиальные различия:

  • Безопасность: DTL по умолчанию экранирует все переменные (кроме помеченных safe), что предотвращает XSS-атаки. Jinja2 также экранирует, но по умолчанию только в HTML-режиме.
  • Ограничения: DTL не позволяет выполнять произвольный код Python в шаблонах, в то время как Jinja2 поддерживает вызов функций и методов объектов (при условии, что они разрешены).
  • Производительность: Jinja2 обычно быстрее DTL за счёт компиляции шаблонов в байт-код Python. DTL использует интерпретацию на основе AST.
  • Гибкость: Jinja2 предоставляет более широкий набор встроенных тегов и фильтров, а также поддерживает макросы и блоки с возможностью переопределения в любом порядке. DTL строже в наследовании (блоки могут быть только в определённых местах).
  • Интеграция с Django: DTL полностью интегрирован с фреймворком (автоматическая обработка CSRF, статических файлов, URL-адресов). Для использования Jinja2 в Django требуется дополнительная настройка.

Применение

DTL используется в проектах на Django для генерации HTML-страниц, писем, XML-карт сайта, RSS-лент и других текстовых форматов. Он подходит для проектов любой сложности — от небольших блогов до крупных веб-приложений (например, Instagram, Pinterest, Disqus, которые используют Django). DTL также применяется в админ-панели Django для отображения интерфейса управления.

Критика

Основные недостатки DTL связаны с его ограниченностью по сравнению с Jinja2:

  • Низкая производительность при большом количестве шаблонов.
  • Отсутствие поддержки макросов и более сложных конструкций.
  • Сложность отладки — ошибки в шаблонах часто приводят к неинформативным сообщениям.
  • Ограниченная поддержка асинхронности (в Django 4.0+ появилась частичная поддержка, но DTL не оптимизирован для асинхронного рендеринга).

Тем не менее, для большинства типовых задач DTL остаётся достаточным и предпочтительным выбором благодаря простоте, безопасности и тесной интеграции с Django.

Интересные факты

  • Название «Django Template Language» официально используется в документации Django, однако в сообществе часто встречается сокращение «DTL».
  • В версии Django 1.8 была добавлена возможность использования нескольких шаблонизаторов, что позволило разработчикам выбирать между DTL и Jinja2.
  • DTL не поддерживает наследование нескольких шаблонов (множественное наследование) — только линейную цепочку через extends.
  • Фильтр safe в DTL является одним из самых опасных, так как отключает экранирование, что может привести к XSS-уязвимостям, если данные не проверены.
  • В Django 5.0 были улучшены обработка ошибок в шаблонах и добавлена поддержка новых типов фильтров.

Источники

  • Официальная документация Django: «The Django template language» (djangoproject.com)
  • Книга «Django 3 by Example» (Antonio Melé, 2020)
  • Документация Django 5.0: «Templates» (docs.djangoproject.com/en/5.0/topics/templates/)
  • Статья «Django vs Jinja2: Which Template Engine to Choose?» (Real Python, 2021)
  • Исходный код Django: django/template/ (GitHub, 2023)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →