Содержание
Глава 2
В предыдущей главе вы видели как мы возвращали HTML-код из наших представлений — он был вписан непосредственно в код Python, например:
def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
Хотя этот способ подходит в целях демонстрации того, как работают представления, это не самая хорошая идея — держать код HTML прямо в представлениях, и вот почему:
- Любые изменения в дизайне страницы потребует изменений кода Python. Изменения дизайна обычно выполняется намного чаще, чем программного кода, поэтому было намного более правильно, если менять дизайн можно было без вмешательства в код Python.
- Написание кода Python и разработка HTML две разных задачи, и большинство веб-проектов при разработке приложения разделяют эти задачи между разными людьми (или даже разными подразделениями). Веб-дизайнеры и HTML/CSS разработчики не должны заниматься редактированием кода Python, что бы сделать их работу.
- Будет намного эффективнее, если программисты Python и разработчики интерфейса смогут выполнять работу одновременно, вместо того, что бы ждать пока один из них завершит редактирование одного файла, который содержит код и HTML, и Python.
Вот почему намного лучше разделять разработку кода самих страниц, и кода Python. В Django это реализовано с помощью системы шаблонов (template system), которую мы рассмотрим далее в этой главе.
Основы системы шаблонов
Шаблоны в Django — это некий текст, который должен разделять внешнее представление документа и его данные. В шаблоне определяются заменители данных и некоторая базовая логика (теги шаблона, template tags), которые определяют как именно документ будет отображаться. Как правило, шаблоны используется для передачи HTML-кода, но в Django их можно использовать для любого текстового формата.
Давайте начнём с простого примера. Этот шаблон описывает HTML-страницу с благодарностью клиенту, который оформил заказ в нашей компании:
<html> <head><title>Ordering notice</title></head> <body> <h1>Ordering notice</h1> <p>Dear {{ person_name }},</p> <p>Thanks for placing an order from {{ company }}. It's scheduled to ship on {{ ship_date|date:"F j, Y" }}.</p> <p>Here are the items you've ordered:</p> <ul> {% for item in item_list %} <li>{{ item }}</li> {% endfor %} </ul> {% if ordered_warranty %} <p>Your warranty information will be included in the packaging.</p> {% else %} <p>You didn't order a warranty, so you're on your own when the products inevitably stop working.</p> {% endif %} <p>Sincerely,<br />{{ company }}</p> </body> </html>
Он представляет собой обычный код HTML с некоторыми переменными и тегами шаблона внутри. Давайте рассмотрим его подробнее:
- Любой текст, помещённый между парой фигурных скобок является переменной (например —
{{ person_name }}
). Это значит — «Вставить значение переменной с заданным именем в этом месте» (как задавать значения переменных — мы рассмотрим чуть позже). -
Любой текст, помещённый между фигурными скобками и знаками процента (например
{% if ordered_warranty %}
) — это тег шаблона. Определение тега очень широкое — тег указывает системе шаблона «что-то выполнить в этом месте«.В этом примере имеет тег
for
({% for item in item_list %}
) и тегif
({% if ordered_warranty %}
).Тег
for
работает практически так же, как и операторfor
в Python, позволяя выполнять итерацию каждого элемента в какой-то последовательности. Тегif
, как вы догадываетесь, является аналогом логического оператораif
. В данном случае — он проверяет является ли значение переменнойordered_warranty
True
илиFalse
. ЕслиTrue
— система шаблонов отобразит всё между{% if ordered_warranty %}
и{% else %}
. Если нет — то система выведет всё между{% else %}
и{% endif %}
. Обратите внимание, что указание тега{% else %}
опционально. - В конце, во второй части этого шаблона, находится пример фильтра (filter), который является наиболее удобным способом форматирования значений переменных. В этом примере,
{{ ship_date|date:"F j, Y" }}
, мы передаём переменнуюship_date
фильтруdate
, а фильтру передаём аргументы"F j, Y
«. Фильтр date форматирует даты в заданном формате, который определяется заданными аргументами. Подключаются фильтры с помощь канала (pipe) —|
, аналогично Unix-системам.
Каждый шаблон в Django имеет доступ к нескольким встроенным тегам и фильтрам, многие из которых мы рассмотрим далее в той главе.
Продолжение — Django Book: использование системы шаблонов.