Содержание
Глава 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: использование системы шаблонов.