Пример простого шаблона.
<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 %} сообщает шаблонной системе, что она может заменить эти порции кода на дочерние шаблоны.
<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 %} сообщает шаблонной системе, что она может заменить эти порции кода на дочерние шаблоны.
Комментариев нет:
Отправить комментарий