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 →