Django Book: основы системы шаблонов

Автор: | 11/02/2015
 

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