среда, 22 августа 2012 г.

Django Templates Простые шаблоны

 Пример простого шаблона.

<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>

Любой текст, окруженный парой фигурных скобок {{ person_name }}, является переменной, что означает "вставить значение переменной, имеющей данное имя в это место".

Любой текст, окруженный парой фигурных скобок и знаками процента {% if ordered_warranty %} является тэгом. Тэг говорит шаблонной системе выполнить в этом месте некоторые действия.

Для примера шаблон содержит тэг for ({% for item in item_list %}) и тэг if {% if ordered_warranty %}.

Для форматирования данных в переменных может использоваться специальный фильтр, который добавляется с использованием специального символа |. В фильтр {{ ship_date|date:"F j, Y" }} мы передаем переменную ship_date и аргументы "F j, Y". В итоге фильтр форматирует дату.

Список тэгов, используемых в Django.

if/else

Тэг {% if %} проверяет значение переменной. Если значение переменной “True”, то есть она существует, не пуста и не равна false, то система отобразит все, что заключено между тэгами {% if %} и {% endif %}.

Для примера:

{% if today_is_weekend %}
    <p>Welcome to the weekend!</p>
{% endif %}

Тэг {% else %} является не обязательным:

{% if today_is_weekend %}
    <p>Welcome to the weekend!</p>
{% else %}
    <p>Get back to work.</p>
{% endif %}

Тэг {% if %} принимает так же значения and, or, or not для проверки сразу нескольких переменных.

Для примера:

{% if athlete_list and coach_list %}
    Both athletes and coaches are available.
{% endif %}

{% if not athlete_list %}
    There are no athletes.
{% endif %}

{% if athlete_list or coach_list %}
    There are some athletes or some coaches.
{% endif %}

{% if not athlete_list or coach_list %}
    There are no athletes or there are some coaches.
{% endif %}

{% if athlete_list and not coach_list %}
    There are some athletes and absolutely no coaches.
{% endif %}

Тэги {% if %} позволяют одновременно указывать and и or внутри одного тэга.

Для примера, следующее будет неправильным:

{% if athlete_list and coach_list or cheerleader_list %}


Для разветвленной логики можно использовать несколько вложенных тэгов {% if %}

Для примера:

{% if athlete_list %}
    {% if coach_list or cheerleader_list %}
        We have athletes, and either coaches or cheerleaders!
    {% endif %}
{% endif %}

Вы не можете комбинировать различные операторы.

Следующее будет неверным:

{% if athlete_list or coach_list or parent_list or teacher_list %}

В системе не предусмотрено тэга {% elif %}. Вместо него используете несколько вложенных  тэгов {% if %} для реализации подобного функционала.

Для примера:
{% if athlete_list %}
    <p>Here are the athletes: {{ athlete_list }}.</p>
{% else %}
    <p>No athletes are available.</p>
    {% if coach_list %}
        <p>Here are the coaches: {{ coach_list }}.</p>
    {% endif %}
{% endif %}

for

Тэг {% for %} позволяет создавать циклы, в которых будут перебраны все значения переменных. На каждом шаге цикла система будет отрисовывать все, что находится между тэгами {% for %} и {% endfor %}.

Для примера, вы можете отобразить список атлетов, переданных в переменной athlete_list:

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

Значения из переменной можно вывести и вобратном порядке:

{% for athlete in athlete_list reversed %}
...
{% endfor %}

Циклы можно делать вложенными:

{% for athlete in athlete_list %}
    <h1>{{ athlete.name }}</h1>
    <ul>
    {% for sport in athlete.sports_played %}
        <li>{{ sport }}</li>
    {% endfor %}
    </ul>
{% endfor %}

Распространенной практикой является проверка размера списка до начала цикла и вывода особого сообщения, если список оказался пуст:

{% if athlete_list %}
    {% for athlete in athlete_list %}
        <p>{{ athlete.name }}</p>
    {% endfor %}
{% else %}
    <p>There are no athletes. Only computer programmers.</p>
{% endif %}

Для вывода сообщения о пустой переменной можно использовать специальный тэг {% empty %}:

{% for athlete in athlete_list %}
    <p>{{ athlete.name }}</p>
{% empty %}
    <p>There are no athletes. Only computer programmers.</p>
{% endfor %}

К сожалению, система не позволяет выйти из цикла до полного его завершения.

С каждым циклом {% for %} вы получаете доступ к специальной переменной, называемой forloop. Эта переменная содержит несколько атрибутов, которые дают вам информацию о состоянии цикла в данный момент:
forloop.counter хранит число шагов уже пройденных циклом. Отсчет начинается с 1, то есть с начала цикла значение forloop.counter изменится с 0 на 1.

Для примера:

{% for item in todo_list %}
    <p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

forloop.counter0 похож на forloop.counter, за исключением того, что отсчет в нем ведется с 0.

forloop.revcounter хранит число оставшихся объектов (item) в цикле. С начала цикла forloop.revcounter имеет значение общего цисла объектов в переданной вами последовательности. На последнем шаге цикла forloop.revcounter будет иметь значение 1.

forloop.revcounter0 похож на forloop.revcounter, за исключением того, что отсчет в нем ведется с 0. С начала цикла forloop.revcounter0 имеет значение общего цисла объектов в переданной вами последовательности минус 1. На последнем шаге цикла forloop.revcounter0 будет иметь значение 0.

forloop.first хранит в себе значение True, если это первый шаг цикла.

{% for object in objects %}
    {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
    {{ object }}
    </li>
{% endfor %}

forloop.last хранит в себе значение True, если это последний шаг цикла.

{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}

В результате выполнения данного цикла на экран будет выведена следующая последовательность:

Link1 | Link2 | Link3 | Link4

forloop.parentloop - это ссылка на объект forloop родительского цикла для случая вложенных циклов.

{% for country in countries %}
    <table>
    {% for city in country.city_list %}
        <tr>
          <td>Country #{{ forloop.parentloop.counter }}</td>
          <td>City #{{ forloop.counter }}</td>
          <td>{{ city }}</td>
        </tr>
    {% endfor %}
    </table>
{% endfor %}

Переменные forloop доступны только внутри циклов.

ifequal/ifnotequal

Для сравнения значений двух переменных используется тэг {% ifequal %}.
Тэг {% ifequal %} сравнивает два значения и отображает все, что находится между {% ifequal %} и {% endifequal %}, если значения совпадают.

Для примера:

{% ifequal user currentuser %}
    <h1>Welcome!</h1>
{% endifequal %}

Аргументы в выражении сравнения могут быть обычными строками внутри одинарных или двойных кавычек.

{% ifequal section 'sitenews' %}
    <h1>Site News</h1>
{% endifequal %}

{% ifequal section "community" %}
    <h1>Community</h1>
{% endifequal %}

Как в случае тэга {% if %}, тэг {% ifequal %} поддерживает необязательный тэг {% else %}:

{% ifequal section 'sitenews' %}
    <h1>Site News</h1>
{% else %}
    <h1>No News Here</h1>
{% endifequal %}

Для сравнения допускаются только переменные, содержащие тип: string, integers и decimal number:

{% ifequal variable 1 %}
{% ifequal variable 1.23 %}
{% ifequal variable 'foo' %}
{% ifequal variable "foo" %}

Все остальные типы переменных, такие как: dictionary, lists или Boolean, не могут быть выведены для сравнения в шаблоне.

Эти примеры будут недопустимы:

{% ifequal variable True %}
{% ifequal variable [1, 2, 3] %}
{% ifequal variable {'key': 'value'} %}

Если вам необходимо протестировать что-то на наличие true или false, то используйте тэг {% if %} вместо тэга {% ifequal %}.

Комментарии в коде

Шаблоны Django позволяют использовать комментарии в коде. Для обрамления комментариев используется последовательность символов {# #}:

{# This is a comment #}

Комментарии не обрабатываются при построении шаблона.

Комментарии не могут разбиваться на несколько строк.

В данном примере система не примет данную последовательность символов как комментарий и выведет весь текст на экран:

This is a {# this is not
a comment #}
test.

Если вам необходимо разбить комментарий на несколько строк, то воспользуйтесь тэгом {% comment %}:

{% comment %}
This is a
multi-line comment.
{% endcomment %}

Фильтры

Фильтры предназначены для преобразования данных, находящихся в переменных, в соответствии с заданным шаблоном. Фильтры отделяются специальным символм | вот так:

{{ name|lower }}

Данный фильтр преобразует весь текст из переменной name в текст с нижним регистром.

Вильтры могут быть объеденены в цепочки, выполняющие фильтры последовательно друг за другом:

{{ my_list|first|upper }}

Некоторые фильтры могут принимать аргументы, размещающиеся после двоеточия в двойных кавычках.

Для примера:

{{ bio|truncatewords:"30" }}

Это фильтр выведет на экран первые 30 слов из переменной bio.

Вот перечень самых важных фильтров:

addslashes - добавляет символ backslash перед любым символом backslash, одиночной кавычкой или двойной кавычкой. Это слежит защитой текста, включенного в JavaScript-строку.

date - форматирует дату или объект datetime в соотвествии с форматом строки, заданной в параметре фильтра:

{{ pub_date|date:"F j, Y" }}

length - возвращает длину переменной. Для списков возвращает число элементов. Для строк возвращает число символов.

include

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

Два примера включения в шаблон содержимого из файла nav.html:

{% include 'nav.html' %}
{% include "nav.html" %}

Допускается использовать как одинарные, так и двойные кавычки.

Пример включения файла includes/nav.html, содержащегося в другой папке:

{% include 'includes/nav.html' %}

Пример включения шаблона, название которого содержится в переменной template_name:

{% include template_name %}

Наследование шаблонов

Наследование шаблонов позволяет создать каркас страницы, который будет включать в себя все используемые части страницы, именуемые блоками.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My helpful timestamp site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
    {% endblock %}
</body>
</html>

Шаблонный тэг {% block %} сообщает шаблонной системе, что она может заменить эти порции кода на дочерние шаблоны.

Комментариев нет:

Отправить комментарий