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