Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Шаблонизация Python: Разработка на фреймворке Django

Шаблонизация, шаблоны, язык шаблонизатора

Web-приложение как правило состоит из Web-страниц. Даже если приложение реализует большую часть интерфейса пользователя с помощью JavaScript, домашняя страница всё равно отдаётся сервером. Да и ситуации, когда старый добрый "страничный сайт" хорошо решает поставленные задачи, возникают часто. Поэтому подсистема шаблонизации остаётся важной частью full-stack фреймворков.

Что же такое шаблон? Это "почти готовый" текстовый документ, в котором все части текста, которые не меняются, представлены как есть. А небольшая (или большая!) динамическая часть описана на некотором языке с ветвлениями, условиями, циклами, которые позволяют преобразовать данные в подходящее для этого конкретного документа представление. Этот язык называют языком шаблонизации (templating language).

Важно знать, что на уровне шаблона происходит разделение ответственности. Шаблон страницы знает, как отобразить данные в виде HTML. А сами данные не зависят от этого конкретного представления и могут быть представлены по-разному разными шаблонами. Проще говоря, по данным вообще нельзя сказать, что они будут представлены в виде HTML (и в каком либо другом конкретном виде)! Шаблонизатор возводит барьер абстракции. И именно для того, чтобы из кода, формирующего данные, не нужно было заниматься "программированием отображения", шаблонизатор имеет свой небольшой язык программирования отображения. А для того, чтобы не было соблазна прямо в шаблоне получать данные, этот язык сделан небольшим!

Шаблонизация в Django

В Django шаблонизация проработана достаточно глубоко (как и многое другое!). Есть встроенный шаблонизатор, можно использовать сторонние шаблонизаторы вроде Jinja2 и можно даже сочетать несколько шаблонизаторов в одном проекте (это может быть удобно, когда какие-то шаблоны вам достаются "в наследство", либо когда вы переезжаете с одного шаблонизатора на другой).

Для того, чтобы шаблон превратить в результат, Django использует backends. Встроенных бэкенда два: DjangoTemplates и Jinja2. Сторонние пакеты могут предоставлять свои backends.

Чтобы бэкенд мог что-то с шаблоном сделать, нужно этот самый шаблон где-то взять. Django самостоятельно загружает шаблоны из файлов, знает, где эти файлы найти, запоминает (кэширует) часто используемые шаблоны в памяти. Вам остаётся только помнить имя шаблона, который вы хотите использовать в данный момент.

Настраивается всё это богатство всё также в settings.py с помощью переменной TEMPLATES. Выглядит настройка так:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            # ... параметры шаблонизатора ...
        },
    },
]

Самое важное здесь — DIRS и APP_DIRS. Первый параметр просто перечисляет директории, в которых будет производиться поиск шаблонов. А вот второй разрешает Django искать шаблоны в директориях приложений. При "включенном" APP_DIRS в каждом подключенном приложении будет искаться директория "templates", а в ней — шаблоны.

Шаблоны приложений

Одно приложение у нас в учебном проекте уже имеет шаблон. Я имею в виду главное приложение hello_django и шаблон hello_django/templates/index.html. Django находит и загружает этот шаблон, потому что опция APP_DIRS включена по умолчанию.

Если вы сейчас создадите новый шаблон hello_django/calc/templates/index.html, то при поиске по имени "index.html" первым будет найден старый шаблон hello_django/templates/index.html! Получается так потому, что приложение hello_django находится в списке settings.INSTALLED_APPS выше приложения hello_django.calc! И если переставить приложения в этом списке местами, то загрузчик шаблонов учтёт изменения!

С помощью управления порядком подключения приложений вы можете переопределять шаблоны одних приложений шаблонами из других! Это интересная возможность, но из-за неё же приходится следить за тем, чтобы шаблоны не перепутывались случайно.

Чтобы не думать слишком много над тем, чтобы не путать шаблоны, стоит придерживаться такого правила: все шаблоны проекта, которые используются только в нём, стоит хранить в отдельной директории в корне проекта (которую нужно добавить в settings.TEMPLATES.DIRS) и держать эту директорию в порядке — использовать поддиректории и хорошие имена.

Для тех же приложений, которые вы планируете использовать повторно, внутри соответствующей директории templates иметь поддиректорию с именем приложения и все шаблоны располагать в ней. Это уменьшит вероятность конфликтов имён шаблонов.

Контекст шаблонизации

Шаблоны превращаются в текст с помощью выполнения кода на языке шаблонизатора. И этот код обычно подразумевает использование каких-то данных, получаемых вне шаблона. Данные передаются в шаблон с помощью контекста (context), который по сути представляет собой словарь. Когда вы вызываете render(request, 'template.html', context={}), вы передаёте этот самый словарь в качестве аргумента.

Часто возникает задача иметь в контексте шаблона доступ к параметрам запроса или настройкам проекта. "Пробрасывать" такие вещи явно слишком утомительно, поэтому Django имеет механизм Context Processors — этаких посредников между вами и шаблоном, расширяющих контекст единым образом для всех шаблонов.

Процессоры контекста вызываются как функции, которые получают в качестве аргумента request и возвращают словарь, который затем дополняет предоставленный вами контекст. Подключаются context processors в settings.TEMPLATES.OPTIONS.context_processors — это список строк с полными именами процессоров.

С Django поставляется множество готовых процессоров контекста. Упомяну парочку для примера:

  • django.template.context_processors.request добавляет в контекст переменную request с очевидным значением,
  • django.template.context_processors.debug добавляет переменную debug, которая истинна, если сервер запущен в режиме разработчика. С помощью этой переменной вы можете выводить какую-то отладочную информацию, которая не будет видна в "боевом режиме".

В дополнение к встроенным вы можете создавать и свои процессоры контекста или же брать их из сторонних библиотек.

Встроенный язык шаблонов

Я не стану описывать все возможности языка шаблонов, они и так отлично описаны в официальной документации. Отмечу лишь, что в шаблонах есть инструкции вроде {% if .. %} и {% for %}, и подстановки вида {{ выражение }}. И в подстановках и в инструкциях вы можете использовать переменные из контекста. Простые конструкции вроде обращения по ключу, по индексу, по имени атрибута вам доступны, поэтому контекст может содержать и сложносоставные сущности. А вот вызывать функции и методы уже не получится — это то самое отделение логики от представления.

Задание

  • Добавьте для hello_django.calc.views.index отдельный шаблон, который поместите в приложении hello_django.calc в директорию templates/calc.
  • Выводите результат вычисления суммы с помощью шаблона. Используйте подстановки, все значения передавайте через контекст (в том числе и сумму — негоже складывать числа в шаблоне!).

Ссылки


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»