Встроенные теги и фильтры шаблонов
Справочник по встроенным тегам
autoescape
Управляет текущим поведением автоматической экранировки. Этот тег принимает on или off в качестве аргумента, определяющего, включена ли автоматическая экранировка внутри блока. Блок закрывается тегом endautoescape.
Когда автоматическая экранировка включена, все содержимое переменных подвергается HTML-экранированию перед отображением результата (но после применения любых фильтров). Это эквивалентно ручному применению фильтра escape к каждой переменной.
Исключение составляют переменные, которые уже помечены как «безопасные» для экранирования, либо кодом, заполняющим переменную, либо потому, что к ним применено фильтр safe или escape.
Пример использования:
{% autoescape on %}
{{ body }}
{% endautoescape %}
block
Определяет блок, который может быть переопределён дочерними шаблонами. Подробнее см. Наследование шаблонов.
comment
Игнорирует всё между {% comment %} и {% endcomment %}. В первом теге может быть вставлена необязательная заметка. Например, это полезно при комментировании кода, чтобы объяснить, почему он был отключен.
Пример использования:
<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
<p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}
Теги comment не могут быть вложены.
csrf_token
Этот тег используется для защиты от CSRF-атак, как описано в документации по Межсайтовым атак подделки запросов.
cycle
Выводит один из своих аргументов каждый раз, когда встречается этот тег. Первый аргумент выводится при первой встрече, второй — при второй и так далее. После исчерпания всех аргументов тег возвращается к первому аргументу и выводит его снова.
Этот тег особенно полезен в цикле:
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
В первой итерации выводится HTML, который ссылается на класс row1, во второй — на row2, в третьей — на row1 и так далее на каждой итерации цикла.
Вы также можете использовать переменные. Например, если у вас есть две переменные шаблона, rowvalue1 и rowvalue2, вы можете чередовать их значения следующим образом:
{% for o in some_list %}
<tr class="{% cycle rowvalue1 rowvalue2 %}">
...
</tr>
{% endfor %}
Переменные, включенные в цикл, будут экранированы. Вы можете отключить автоматическую экранировку с помощью:
{% for o in some_list %}
<tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}">
...
</tr>
{% endfor %}
Вы можете смешивать переменные и строки:
{% for o in some_list %}
<tr class="{% cycle 'row1' rowvalue2 'row3' %}">
...
</tr>
{% endfor %}
В некоторых случаях вам может потребоваться обратиться к текущему значению цикла, не переходя к следующему. Для этого просто присвойте тегу {% cycle %} имя с помощью «as», как в этом примере:
{% cycle 'row1' 'row2' as rowcolors %}
После этого вы можете вставить текущее значение цикла в любом месте вашего шаблона, сославшись на имя цикла как на переменную контекста. Если вы хотите переместить цикл к следующему значению независимо от исходного тега cycle, вы можете использовать другой тег cycle и указать имя переменной. Таким образом, следующий шаблон:
<tr>
<td class="{% cycle 'row1' 'row2' as rowcolors %}">...</td>
<td class="{{ rowcolors }}">...</td>
</tr>
<tr>
<td class="{% cycle rowcolors %}">...</td>
<td class="{{ rowcolors }}">...</td>
</tr>
выведет:
<tr>
<td class="row1">...</td>
<td class="row1">...</td>
</tr>
<tr>
<td class="row2">...</td>
<td class="row2">...</td>
</tr>
Вы можете использовать любое количество значений в теге cycle, разделённых пробелами. Значения, заключённые в одинарные кавычки (') или двойные кавычки ("), обрабатываются как строковые литералы, а значения без кавычек — как переменные шаблона.
По умолчанию, при использовании ключевого слова as с тегом cycle, использование тега {% cycle %}, который инициирует цикл, само по себе выводит первое значение в цикле. Это может быть проблемой, если вы хотите использовать это значение в вложенном цикле или включённом шаблоне. Если вы хотите только объявить цикл, но не выводить первое значение, вы можете добавить ключевое слово silent в качестве последнего ключевого слова в теге. Например:
{% for obj in some_list %}
{% cycle 'row1' 'row2' as rowcolors silent %}
<tr class="{{ rowcolors }}">{% include "subtemplate.html" %}</tr>
{% endfor %}
Это выведет список элементов <tr> с class, чередующимися между row1 и row2. Подшаблон будет иметь доступ к rowcolors в своём контексте, и значение будет соответствовать классу <tr>, который его включает. Если ключевое слово silent будет опущено, row1 и row2 будут выведены как обычный текст вне элемента <tr>.
При использовании ключевого слова silent в определении цикла, молчание автоматически применяется ко всем последующим использованиям этого тега cycle. Следующий шаблон ничего не выведет, даже если второй вызов {% cycle %} не указывает silent.
{% cycle 'row1' 'row2' as rowcolors silent %}
{% cycle rowcolors %}
debug
Выводит большое количество отладочной информации, включая текущий контекст и импортированные модули.
extends
Указывает, что этот шаблон расширяет родительский шаблон.
Этот тег может быть использован двумя способами:
-
{% extends "base.html" %}(в кавычках) использует буквальное значение"base.html"в качестве имени родительского шаблона для расширения. -
{% extends variable %}использует значениеvariable. Если переменная оценивается как строка, Django использует эту строку как имя родительского шаблона. Если переменная оценивается как объектTemplate, Django будет использовать этот объект как родительский шаблон.
Подробнее см. Наследование шаблонов.
Строковый аргумент может быть относительным путём, начинающимся с ./ или ../. Например, предположим следующую структуру директорий:
dir1/
template.html
base2.html
my/
base3.html
base1.html
В template.html, следующие пути будут допустимы:
{% extends "./base2.html" %}
{% extends "../base1.html" %}
{% extends "./my/base3.html" %}
Была добавлена возможность использовать относительные пути.
filter
Фильтры содержимое блока через один или несколько фильтров. Несколько фильтров могут быть указаны с помощью символа |, а фильтры могут иметь аргументы, точно так же, как и в синтаксисе переменных.
Обратите внимание, что блок включает все текст между тегами filter и endfilter.
Пример использования:
{% filter force_escape|lower %}
This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
Примечание
Фильтры escape и safe не являются допустимыми аргументами. Вместо этого используйте тег autoescape для управления автоматическим экранированием блоков кода шаблона.
firstof
Выводит первую переменную-аргумент, которая не False. Не выводит ничего, если все переданные переменные False.
Пример использования:
{% firstof var1 var2 var3 %}
Это эквивалентно:
{% if var1 %}
{{ var1 }}
{% elif var2 %}
{{ var2 }}
{% elif var3 %}
{{ var3 }}
{% endif %}
Вы также можете использовать строковый литерал в качестве значения по умолчанию, если все переданные переменные False:
{% firstof var1 var2 var3 "fallback value" %}
Этот тег автоматически экранирует значения переменных. Вы можете отключить автоматическую экранировку с помощью:
{% autoescape off %}
{% firstof var1 var2 var3 "<strong>fallback value</strong>" %}
{% endautoescape %}
Или, если нужно экранировать только некоторые переменные, вы можете использовать:
{% firstof var1 var2|safe var3 "<strong>fallback value</strong>"|safe %}
Вы можете использовать синтаксис {% firstof var1 var2 var3 as value %} для хранения вывода в переменной.
Добавлен синтаксис «as».
for
Перебирает каждый элемент в массиве, делая элемент доступным в переменной контекста. Например, чтобы отобразить список спортсменов, предоставленных в athlete_list:
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
Вы можете перебрать список в обратном порядке, используя {% for obj in list reversed %}.
Если вам нужно перебрать список списков, вы можете распаковать значения каждого подсписка в отдельные переменные. Например, если в вашем контексте содержится список координат (x, y) под названием points, вы можете использовать следующее для вывода списка точек:
{% for x, y in points %}
There is a point at {{ x }},{{ y }}
{% endfor %}
Это также может быть полезно, если вам нужно получить доступ к элементам в словаре. Например, если ваш контекст содержал словарь data, следующее отобразило бы ключи и значения словаря:
{% for key, value in data.items %}
{{ key }}: {{ value }}
{% endfor %}
Учитывайте, что для оператора точка поиск по ключу словаря имеет приоритет перед поиском по методу. Таким образом, если словарь data содержит ключ с именем 'items', data.items вернёт data['items'] вместо data.items(). Избегайте добавления ключей, которые имеют такие же имена, как методы словаря, если хотите использовать эти методы в шаблоне (items, values, keys и т. д.). Подробнее о порядке поиска оператора точки см. в документации по переменным шаблона.
Цикл for устанавливает ряд переменных, доступных внутри цикла:
| Переменная | Описание |
|---|---|
forloop.counter | Текущая итерация цикла (индексируется с 1) |
forloop.counter0 | Текущая итерация цикла (индексируется с 0) |
forloop.revcounter | Количество итераций с конца цикла (индексируется с 1) |
forloop.revcounter0 | Количество итераций с конца цикла (индексируется с 0) |
forloop.first | True, если это первая итерация цикла |
forloop.last | True, если это последняя итерация цикла |
forloop.parentloop | Для вложенных циклов, это цикл, окружающий текущий |
for … empty
Тег for может принять необязательную часть {% empty %}, текст которой будет отображен, если указанный массив пуст или не найден:
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% empty %}
<li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>
Вышеприведённый код эквивалентен, но короче, понятнее и возможно быстрее следующего:
<ul>
{% if athlete_list %}
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
{% else %}
<li>Sorry, no athletes in this list.</li>
{% endif %}
</ul>
if
Тег {% if %} оценивает переменную, и если эта переменная «истина» (т. е. существует, не пуста и не имеет ложного значения булевого типа), содержимое блока выводится:
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %}
В приведенном примере, если athlete_list не пусто, количество спортсменов будет отображено переменной {{ athlete_list|length }}.
Как видите, тег if может принимать один или несколько {% elif %} условий, а также условие {% else %}, которое будет отображено, если все предыдущие условия не выполнены. Эти условия являются необязательными.
Булевы операторы
if теги могут использовать and, 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 %}
Использование как and, так и or условий в одном теге разрешено, при этом and имеет более высокий приоритет, чем or, например:
{% if athlete_list and coach_list or cheerleader_list %}
будет интерпретировано как:
if (athlete_list and coach_list) or cheerleader_list
Использование фактических скобок в теге if является недопустимым синтаксисом. Если вам нужно использовать их для указания приоритета, вы должны использовать вложенные теги if.
if теги также могут использовать операторы ==, !=, <, >, <=, >=, in, not in, is, и is not, которые работают следующим образом:
== оператор
Равенство. Пример:
{% if somevar == "x" %}
This appears if variable somevar equals the string "x"
{% endif %}
!= оператор
Неравенство. Пример:
{% if somevar != "x" %}
This appears if variable somevar does not equal the string "x",
or if somevar is not found in the context
{% endif %}
< оператор
Меньше. Пример:
{% if somevar < 100 %}
This appears if variable somevar is less than 100.
{% endif %}
> оператор
Больше. Пример:
{% if somevar > 0 %}
This appears if variable somevar is greater than 0.
{% endif %}
<= оператор
Меньше или равно. Пример:
{% if somevar <= 100 %}
This appears if variable somevar is less than 100 or equal to 100.
{% endif %}
>= оператор
Больше или равно. Пример:
{% if somevar >= 1 %}
This appears if variable somevar is greater than 1 or equal to 1.
{% endif %}
in оператор
Входит в. Этот оператор поддерживается многими контейнерами Python для проверки, содержится ли заданное значение в контейнере. Ниже приведены некоторые примеры того, как x in y будет интерпретироваться:
{% if "bc" in "abcdef" %}
This appears since "bc" is a substring of "abcdef"
{% endif %}
{% if "hello" in greetings %}
If greetings is a list or set, one element of which is the string
"hello", this will appear.
{% endif %}
{% if user in users %}
If users is a QuerySet, this will appear if user is an
instance that belongs to the QuerySet.
{% endif %}
not in оператор
Не входит в. Это отрицание оператора in.
is оператор
Тождество объектов. Проверяет, являются ли два значения одним и тем же объектом. Пример:
{% if somevar is True %}
This appears if and only if somevar is True.
{% endif %}
{% if somevar is None %}
This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
is not оператор
Отрицание тождества объектов. Проверяет, не являются ли два значения одним и тем же объектом. Это отрицание оператора is. Пример:
{% if somevar is not True %}
This appears if somevar is not True, or if somevar is not found in the
context.
{% endif %}
{% if somevar is not None %}
This appears if and only if somevar is not None.
{% endif %}
Фильтры
Вы также можете использовать фильтры в выражении if. Например:
{% if messages|length >= 100 %}
You have lots of messages today!
{% endif %}
Сложные выражения
Всё вышеперечисленное можно комбинировать, чтобы формировать сложные выражения. Для таких выражений важно понимать, как операторы группируются при оценке выражения — то есть, правила приоритета. Приоритет операторов, от низкого к высокому, следующий:
orandnotin-
==,!=,<,>,<=,>=
(Это точно соответствует Python). Например, следующий сложный тег if:
{% if a == b or c == d and e %}
…будет интерпретирован как:
(a == b) or ((c == d) and e)
Если вам нужен другой приоритет, вам нужно использовать вложенные теги if. Иногда это лучше для ясности, особенно для тех, кто не знает правил приоритета.
Операторы сравнения не могут быть «цепными», как в Python или в математической записи. Например, вместо использования:
{% if a > b > c %} (WRONG)
следует использовать:
{% if a > b and b > c %}
ifequal и ifnotequal
{% ifequal a b %} ... {% endifequal %} — устаревший способ написания {% if a == b %} ... {% endif %}. Аналогично, {% ifnotequal a b %} ...
{% endifnotequal %} устарел и заменён на {% if a != b %} ... {% endif %}. Теги ifequal и ifnotequal будут устаревшими в будущих версиях.
ifchanged
Проверяет, изменилось ли значение с последней итерации цикла.
Тег блока {% ifchanged %} используется внутри цикла. Он имеет два возможных применения.
-
Проверяет свои собственные рендеренные содержимое относительно предыдущего состояния и отображает содержимое только в случае изменения. Например, это отображает список дней, отображая месяц только при его изменении:
<h1>Archive for {{ year }}</h1> {% for date in days %} {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %} <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a> {% endfor %} -
Если указаны одна или несколько переменных, проверяет, изменилась ли какая-либо переменная. Например, следующее показывает дату каждый раз, когда она меняется, а также час, если изменился либо час, либо дата:
{% for date in days %} {% ifchanged date.date %} {{ date.date }} {% endifchanged %} {% ifchanged date.hour date.date %} {{ date.hour }} {% endifchanged %} {% endfor %}
Тег ifchanged также может принимать необязательное условие {% else %}, которое будет отображено, если значение не изменилось:
{% for match in matches %}
<div style="background-color:
{% ifchanged match.ballot_id %}
{% cycle "red" "blue" %}
{% else %}
gray
{% endifchanged %}
">{{ match }}</div>
{% endfor %}
include
Загружает шаблон и рендерит его с текущим контекстом. Это способ «включения» других шаблонов в шаблон.
Имя шаблона может быть переменной или жёстко закодированной (в кавычках) строкой, в одинарных или двойных кавычках.
В этом примере содержимое шаблона "foo/bar.html":
{% include "foo/bar.html" %}
Строковый аргумент может быть относительным путем, начинающимся с ./ или ../, как описано в теге extends.
Была добавлена возможность использования относительного пути.
В этом примере содержимое шаблона, имя которого содержится в переменной template_name:
{% include template_name %}
Переменная также может быть любым объектом с методом render(), который принимает контекст. Это позволяет ссылаться на скомпилированный Template в вашем контексте.
Включенный шаблон рендерится в контексте шаблона, который его включает. Этот пример даёт вывод "Hello, John!":
- Контекст: переменная
personимеет значение"John", и переменнаяgreetingимеет значение"Hello". -
Шаблон:
{% include "name_snippet.html" %} -
Шаблон
name_snippet.html:{{ greeting }}, {{ person|default:"friend" }}!
Вы можете передать дополнительный контекст в шаблон, используя ключевые аргументы:
{% include "name_snippet.html" with person="Jane" greeting="Hello" %}
Если вы хотите отобразить только переменные, предоставленные в контексте (или даже без них), используйте опцию only. Другие переменные недоступны включённому шаблону:
{% include "name_snippet.html" with greeting="Hi" only %}
Если включённый шаблон вызывает исключение во время рендеринга (включая случай, когда он отсутствует или имеет синтаксические ошибки), поведение зависит от опции template engine's debug (если не установлено, по умолчанию эта опция равна значению DEBUG). Когда режим отладки включён, будет поднято исключение, подобное TemplateDoesNotExist или TemplateSyntaxError. Когда режим отладки выключен, {% include %} записывает предупреждение в журнал django.template с исключением, произошедшим во время рендеринга включённого шаблона, и возвращает пустую строку.
Журналирование шаблонов теперь включает в себя указанное выше предупреждение о журнале.
Примечание
Тег include следует рассматривать как реализацию «рендерить этот подшаблон и включить HTML», а не как «парсить этот подшаблон и включить его содержимое, как если бы оно было частью родительского шаблона». Это означает, что нет общей области состояния между включёнными шаблонами — каждый include — это полностью независимый процесс рендеринга.
Блоки оцениваются перед их включением. Это означает, что шаблон, включающий блоки из другого, будет содержать блоки, которые уже были оценены и отрисованы, — а не блоки, которые могут быть переопределены, например, расширяющим шаблоном.
load
Загружает набор пользовательских тегов шаблона.
Например, следующий шаблон загрузит все теги и фильтры, зарегистрированные в somelibrary и otherlibrary в пакете package:
{% load somelibrary package.otherlibrary %}
Вы также можете выборочно загружать отдельные фильтры или теги из библиотеки, используя аргумент from. В этом примере теги/фильтры с именами foo и bar будут загружены из somelibrary:
{% load foo bar from somelibrary %}
См. Библиотеки пользовательских тегов и фильтров для получения дополнительной информации.
lorem
Отображает случайный текст «lorem ipsum» на латыни. Это полезно для предоставления образцовых данных в шаблонах.
Использование:
{% lorem [count] [method] [random] %}
Тег {% lorem %} может быть использован с нулём, одним, двумя или тремя аргументами. Аргументы:
| Аргумент | Описание |
|---|---|
count | Число (или переменная), содержащая количество абзацев или слов для генерации (по умолчанию 1). |
method | Либо w для слов, p для HTML-абзацев или b для абзацев простого текста (по умолчанию b). |
random | Слово random, если оно указано, не будет использовать обычный абзац («Lorem ipsum dolor sit amet…»), при генерации текста. |
Примеры:
-
{% lorem %}выведет общий абзац «lorem ipsum». -
{% lorem 3 p %}выведет общий абзац «lorem ipsum» и два случайных абзаца, каждый из которых заключён в теги HTML<p>. -
{% lorem 2 w random %}выведет два случайных латинских слова.
now
Отображает текущую дату и/или время, используя формат, заданный строкой. Эта строка может содержать символы спецификаторов формата, как описано в разделе фильтра date.
Пример:
It is {% now "jS F Y H:i" %}
Обратите внимание, что вы можете экранировать строку формата обратной косой чертой, если хотите использовать её «сырое» значение. В этом примере «o» и «f» экранированы обратной косой чертой, потому что в противном случае каждый из них является строкой формата, отображающей соответственно год и время:
It is the {% now "jS \o\f F" %}
Это отобразится как «Сегодня 4 сентября».
Примечание
Переданный формат также может быть одним из предопределённых DATE_FORMAT, DATETIME_FORMAT, SHORT_DATE_FORMAT или SHORT_DATETIME_FORMAT. Предопределённые форматы могут отличаться в зависимости от текущего языка и от того, включена ли локализация форматов, например:
It is {% now "SHORT_DATETIME_FORMAT" %}
Вы также можете использовать синтаксис {% now "Y" as current_year %} для хранения вывода (как строки) внутри переменной. Это полезно, если вы хотите использовать {% now %} внутри тега шаблона, например, blocktrans:
{% now "Y" as current_year %}
{% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}
regroup
Группирует список похожих объектов по общему атрибуту.
Этот сложный тег лучше всего проиллюстрировать примером: предположим, что cities — это список городов, представленных словарями, содержащими "name", "population", и "country" ключи:
cities = [
{'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
{'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
{'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
{'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
{'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]
…и вы хотите отобразить иерархический список, отсортированный по стране, например:
- Индия
- Мумбаи: 19 000 000
- Калькутта: 15 000 000
- США
- Нью-Йорк: 20 000 000
- Чикаго: 7 000 000
- Япония
- Токио: 33 000 000
Вы можете использовать тег {% regroup %} для группировки списка городов по стране. Следующий фрагмент кода шаблона выполнит это:
{% regroup cities by country as country_list %}
<ul>
{% for country in country_list %}
<li>{{ country.grouper }}
<ul>
{% for city in country.list %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
Давайте разберём этот пример. {% regroup %} принимает три аргумента: список, который нужно сгруппировать, атрибут для группировки и имя результирующего списка. Здесь мы группируем список cities по атрибуту country и называем результат country_list.
{% regroup %} создаёт список (в данном случае country_list) из объектов групп. Каждый объект группы имеет два атрибута:
-
grouper— элемент, по которому была произведена группировка (например, строка «Индия» или «Япония»). -
list— список всех элементов в этой группе (например, список всех городов со страной = «Индия»).
Обратите внимание, что {% regroup %} не сортирует свой вход! Наш пример полагается на то, что список cities был отсортирован по country в первую очередь. Если список cities не сортировал свои элементы по country, группировка бы по умолчанию отображала более одной группы для одной страны. Например, скажем, список cities был задан так (обратите внимание, что страны не сгруппированы вместе):
cities = [
{'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
{'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
{'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
{'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
{'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]
При таком входе для cities, пример {% regroup %} кода шаблона выше даст следующий результат:
- Индия
- Мумбаи: 19 000 000
- США
- Нью-Йорк: 20 000 000
- Индия
- Калькутта: 15 000 000
- США
- Чикаго: 7 000 000
- Япония
- Токио: 33 000 000
Самым простым решением этой проблемы является проверка в вашем коде представления, чтобы данные были отсортированы так, как вы хотите их отобразить.
Другое решение заключается в сортировке данных в шаблоне с помощью фильтра dictsort, если ваши данные находятся в списке словарей:
{% regroup cities|dictsort:"country" by country as country_list %}
Группировка по другим свойствам
Любой допустимый поиск шаблона является допустимым атрибутом группировки для тега regroup, включая методы, атрибуты, ключи словарей и элементы списков. Например, если поле «country» является внешним ключом к классу с атрибутом «description», вы можете использовать:
{% regroup cities by country.description as country_list %}
Или, если country — это поле с choices, у него будет доступен метод get_FOO_display() как атрибут, что позволит вам сгруппировать по строке отображения вместо ключа choices.
{% regroup cities by get_country_display as country_list %}
{{ country.grouper }} теперь отобразит поля значений из набора choices вместо ключей.
spaceless
Удаляет пробелы между тегами HTML. Это включает символы табуляции и новые строки.
Пример использования:
{% spaceless %}
<p>
<a href="foo/">Foo</a>
</p>
{% endspaceless %}
Этот пример вернёт следующий HTML:
<p><a href="foo/">Foo</a></p>
Удаляются только пробелы между тегами — а не пробелы между тегами и текстом. В этом примере пробелы вокруг Hello не будут удалены:
{% spaceless %}
<strong>
Hello
</strong>
{% endspaceless %}
templatetag
Выводит один из символов синтаксиса, используемых для составления тегов шаблонов.
Поскольку система шаблонов не имеет понятия «экранирования», для отображения одного из элементов, используемых в тегах шаблонов, необходимо использовать тег {% templatetag %}.
Аргумент указывает, какой элемент шаблона вывести:
| Аргумент | Выводит |
|---|---|
openblock | {% |
closeblock | %} |
openvariable | {{ |
closevariable | }} |
openbrace | { |
closebrace | } |
opencomment | {# |
closecomment | #} |
Пример использования:
{% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}
url
Возвращает абсолютный путь (URL без доменного имени), соответствующий заданному представлению и необязательным параметрам. Все специальные символы в результирующем пути будут закодированы с помощью iri_to_uri().
Это способ вывода ссылок без нарушения принципа DRY, т.е. без необходимости жёсткого кодирования URL в шаблонах:
{% url 'some-url-name' v1 v2 %}
Первый аргумент — url() name. Он может быть строковым литералом или любой другой переменной контекста. Дополнительные аргументы необязательны и должны быть значениями, разделёнными пробелами, которые будут использоваться как аргументы в URL. Приведённый выше пример демонстрирует передачу позиционных аргументов. Также можно использовать синтаксис с ключевыми словами:
{% url 'some-url-name' arg1=v1 arg2=v2 %}
Не смешивайте позиционный и ключевой синтаксис в одном вызове. Все аргументы, требуемые URLconf, должны быть присутствовать.
Например, предположим, что у вас есть представление app_views.client, для которого URLconf принимает идентификатор клиента (здесь client() — метод внутри файла представлений app_views.py). Строка URLconf может выглядеть так:
('^client/([0-9]+)/$', app_views.client, name='app-views-client')
Если URLconf этого приложения включён в URLconf проекта по пути, например:
('^clients/', include('project_name.app_name.urls'))
…то в шаблоне вы можете создать ссылку на это представление следующим образом:
{% url 'app-views-client' client.id %}
Тег шаблона выведет строку /clients/client/123/.
Обратите внимание, что если обращение URL не существует, будет поднято исключение NoReverseMatch, что приведёт к отображению страницы ошибки на вашем сайте.
Если вы хотите получить URL без его отображения, вы можете использовать немного другой вызов:
{% url 'some-url-name' arg arg2 as the_url %}
<a href="{{ the_url }}">I'm linking to {{ the_url }}</a>
Область переменной, созданной синтаксисом as var, — это {% block %}, в котором появляется тег {% url %}.
Этот синтаксис {% url ... as var %} не вызовет ошибку, если представление отсутствует. На практике вы будете использовать это для связывания с необязательными представлениями:
{% url 'some-url-name' as the_url %}
{% if the_url %}
<a href="{{ the_url }}">Link to optional stuff</a>
{% endif %}
Если вы хотите получить именованный URL, укажите полное имя:
{% url 'myapp:view-name' %}
Это будет следовать стандартной стратегии разрешения именованных URL, включая использование любых подсказок, предоставляемых контекстом относительно текущего приложения.
Предупреждение
Не забудьте поместить кавычки вокруг url() name, в противном случае значение будет интерпретировано как переменная контекста!
verbatim
Запрещает движку шаблонов рендеринг содержимого этого блока тега.
Это часто используется, чтобы позволить слою шаблонов JavaScript, который сталкивается с синтаксисом Django. Например:
{% verbatim %}
{{if dying}}Still alive.{{/if}}
{% endverbatim %}
Вы также можете назначить конкретный закрывающий тег, позволяющий использовать {% endverbatim %} в составе необрабатываемого содержимого:
{% verbatim myblock %}
Avoid template rendering via the {% verbatim %}{% endverbatim %} block.
{% endverbatim myblock %}
widthratio
Для создания диаграмм типа «гистограмма» этот тег вычисляет отношение данного значения к максимальному значению, а затем применяет это отношение к константе.
Например:
<img src="bar.png" alt="Bar"
height="10" width="{% widthratio this_value max_value max_width %}" />
Если this_value — 175, max_value — 200, а max_width — 100, изображение в приведённом выше примере будет иметь ширину 88 пикселей (потому что 175/200 = 0,875; 0,875 * 100 = 87,5, которое округляется до 88).
В некоторых случаях вы можете захотеть сохранить результат widthratio в переменной. Это может быть полезно, например, в теге blocktrans так:
{% widthratio this_value max_value max_width as width %}
{% blocktrans %}The width is: {{ width }}{% endblocktrans %}
with
Кэширует сложное переменное значение под более простым именем. Это полезно при многократном обращении к «дорогостоящему» методу (например, методу, обращению к базе данных).
Например:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
Заполненная переменная (в примере выше, total) доступна только между тегами {% with %} и {% endwith %}.
Можно назначить более одной переменной контекста:
{% with alpha=1 beta=2 %}
...
{% endwith %}
Примечание
Предыдущий более подробный формат всё ещё поддерживается: {% with business.employees.count as total %}
Справочник встроенных фильтров
add
Добавляет аргумент к значению.
Например:
{{ value|add:"2" }}
Если value равно 4, то выходной результат будет 6.
Этот фильтр сначала попытается привести оба значения к целочисленному типу. Если это не удастся, он попытается сложить значения. Это будет работать с некоторыми типами данных (строки, списки и т. д.) и не будет работать с другими. Если это не удастся, результат будет пустой строкой.
Например, если у нас есть:
{{ first|add:second }}
и first равно [1, 2, 3], а second равно [4, 5, 6], то выходной результат будет [1, 2, 3, 4, 5, 6].
Предупреждение
Строки, которые могут быть приведены к целочисленному типу, будут сложены, а не конкатенированы, как в первом примере выше.
addslashes
Добавляет слеши перед кавычками. Полезно для экранирования строк в CSV, например.
Например:
{{ value|addslashes }}
Если value равно "I'm using Django", выходной результат будет "I\'m using Django".
capfirst
Заглавная буква первой буквы значения. Если первая буква не является буквой, этот фильтр не имеет эффекта.
Например:
{{ value|capfirst }}
Если value равно "django", выходной результат будет "Django".
center
Центрирует значение в поле заданной ширины.
Например:
"{{ value|center:"15" }}"
Если value равно "Django", выходной результат будет " Django ".
cut
Удаляет все значения аргумента из заданной строки.
Например:
{{ value|cut:" " }}
Если value равно "String with spaces", выходной результат будет "Stringwithspaces".
date
Форматирует дату в соответствии с заданным форматом.
Использует формат, аналогичный функции PHP’s date() (https://php.net/date), с некоторыми различиями.
Примечание
Эти символы формата не используются в Django вне шаблонов. Они были разработаны для совместимости с PHP для упрощения перехода для разработчиков.
Доступные строки форматов:
| Символ формата | Описание | Пример выходного результата |
|---|---|---|
| a |
'a.m.' или 'p.m.' (Обратите внимание, что это немного отличается от выходного результата PHP, потому что это включает точки для соответствия стилю Associated Press.) | 'a.m.' |
| A |
'AM' или 'PM'. | 'AM' |
| b | Месяц, текстовый, 3 буквы, строчные. | 'jan' |
| B | Не реализовано. | |
| c | Формат ISO 8601. (Примечание: в отличие от других форматировщиков, таких как «Z», «O» или «r», форматировщик «c» не добавит смещение часового пояса, если значение является наивной датой и временем (см. datetime.tzinfo). |
2008-01-02T10:30:00.000123+02:00, или 2008-01-02T10:30:00.000123 если дата и время наивна |
| d | День месяца, 2 цифры с ведущими нулями. |
'01' до '31'
|
| D | День недели, текстовый, 3 буквы. | 'Fri' |
| e | Имя часового пояса. Может быть в любом формате или может вернуть пустую строку в зависимости от даты и времени. |
'', 'GMT', '-500', 'US/Eastern', и т.д. |
| E | Месяц, альтернативное представление, специфичное для локали, обычно используемое для представления длинной даты. |
'listopada' (для польской локали, в отличие от 'Listopad') |
| f | Время, в формате 12-часовых часов и минут, с опущением минут, если они равны нулю. Собственная расширение. |
'1', '1:30'
|
| F | Месяц, текстовый, длинный. | 'January' |
| g | Час, формат 12-часовых часов без ведущих нулей. |
'1' до '12'
|
| G | Час, формат 24-часовых часов без ведущих нулей. |
'0' до '23'
|
| h | Час, формат 12-часовых часов. |
'01' до '12'
|
| H | Час, формат 24-часовых часов. |
'00' до '23'
|
| i | Минуты. |
'00' до '59'
|
| I | Летнее время, действует или нет. |
'1' или '0'
|
| j | День месяца без ведущих нулей. |
'1' до '31'
|
| l | День недели, текстовый, длинный. | 'Friday' |
| L | Логическое значение, является ли год високосным. |
True или False
|
| m | Месяц, 2 цифры с ведущими нулями. |
'01' до '12'
|
| M | Месяц, текстовый, 3 буквы. | 'Jan' |
| n | Месяц без ведущих нулей. |
'1' до '12'
|
| N | Сокращение месяца в стиле Associated Press. Собственная расширение. |
'Jan.', 'Feb.', 'March', 'May'
|
| o | Год по ISO 8601 с учетом недели, соответствующий номеру недели ISO 8601 (W), который использует недели високосности. См. Y для более распространенного формата года. | '1999' |
| O | Разница с Гринвичским временем в часах. | '+0200' |
| P | Время в формате 12-часовых часов, минут и ‘a.m.’/’p.m.’, с опущением минут, если они равны нулю, и специальными случаями «полночь» и «полдень», если это подходит. Собственная расширение. |
'1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
|
| r | RFC 5322 отформатированная дата. | 'Thu, 21 Dec 2000 16:01:07 +0200' |
| s | Секунды, 2 цифры с ведущими нулями. |
'00' до '59'
|
| S | Английское порядковое окончание для дня месяца, 2 символа. |
'st', 'nd', 'rd' или 'th'
|
| t | Количество дней в данном месяце. |
28 до 31
|
| T | Часовой пояс данного компьютера. |
'EST', 'MDT'
|
| u | Микросекунды. |
000000 до 999999
|
| U | Секунды с эпохи Unix (1 января 1970 г. 00:00:00 UTC). | |
| w | День недели, цифры без ведущих нулей. |
'0' (воскресенье) до '6' (суббота) |
| W | Номер недели года по ISO 8601, с началом недели в понедельник. |
1, 53
|
| y | Год, 2 цифры. | '99' |
| Y | Год, 4 цифры. | '1999' |
| z | День года. |
0 до 365
|
| Z | Смещение часового пояса в секундах. Смещение для часовых поясов к западу от UTC всегда отрицательно, а для тех, которые к востоку от UTC, всегда положительно. |
-43200 до 43200
|
Например:
{{ value|date:"D d M Y" }}
Если value — объект datetime (например, результат datetime.datetime.now()), выходной результат будет строка 'Wed 09 Jan 2008'.
Переданный формат может быть одним из предопределённых DATE_FORMAT, DATETIME_FORMAT, SHORT_DATE_FORMAT или SHORT_DATETIME_FORMAT, или пользовательским форматом, который использует символы формата, показанные в таблице выше. Обратите внимание, что предопределенные форматы могут различаться в зависимости от текущей локали.
Предположим, что USE_L10N равно True и LANGUAGE_CODE равно, например, "es", то для:
{{ value|date:"SHORT_DATE_FORMAT" }}
выходной результат будет строка "09/01/2008" (символ формата "SHORT_DATE_FORMAT" для локали es, поставляемой с Django, равен "d/m/Y").
Если используется без строки формата, используется символ формата DATE_FORMAT. Предполагая те же настройки, что и в предыдущем примере:
{{ value|date }}
выведет 9 de Enero de 2008 (символ формата DATE_FORMAT для локали es равен r'j \d\e F \d\e Y').
В более старых версиях, настройка DATE_FORMAT (без локализации) всегда используется, когда строка формата не задана.
Можно комбинировать date с фильтром time для отображения полного представления значения datetime. Например:
{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}
default
Если значение равно False, использует указанное значение по умолчанию. В противном случае, использует значение.
Например:
{{ value|default:"nothing" }}
Если value равно "" (пустой строке), вывод будет nothing.
default_if_none
Если (и только если) значение равно None, используется заданный по умолчанию. В противном случае используется значение.
Обратите внимание, что если задана пустая строка, значение по умолчанию не будет использовано. Используйте фильтр default, если нужно использовать значение по умолчанию для пустых строк.
Например:
{{ value|default_if_none:"nothing" }}
Если value равно None, вывод будет строкой "nothing".
dictsort
Принимает список словарей и возвращает этот список, отсортированный по ключу, заданному в аргументе.
Например:
{{ value|dictsort:"name" }}
Если value равно:
[
{'name': 'zed', 'age': 19},
{'name': 'amy', 'age': 22},
{'name': 'joe', 'age': 31},
]
то вывод будет:
[
{'name': 'amy', 'age': 22},
{'name': 'joe', 'age': 31},
{'name': 'zed', 'age': 19},
]
Вы также можете выполнять более сложные действия, такие как:
{% for book in books|dictsort:"author.age" %}
* {{ book.title }} ({{ book.author.name }})
{% endfor %}
Если books равно:
[
{'title': '1984', 'author': {'name': 'George', 'age': 45}},
{'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
{'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
]
то вывод будет:
* Alice (Lewis) * 1984 (George) * Timequake (Kurt)
dictsort также может упорядочить список списков (или любой другой объект, реализующий __getitem__()) по элементам в указанном индексе. Например:
{{ value|dictsort:0 }}
Если value равно:
[
('a', '42'),
('c', 'string'),
('b', 'foo'),
]
то вывод будет:
[
('a', '42'),
('b', 'foo'),
('c', 'string'),
]
Вы должны передать индекс как целое число, а не строку. Следующие примеры возвращают пустой вывод:
{{ values|dictsort:"0" }}
Добавлена возможность упорядочить список списков.
dictsortreversed
Принимает список словарей и возвращает этот список, отсортированный в обратном порядке по ключу, заданному в аргументе. Это работает точно так же, как и вышеуказанный фильтр, но возвращаемое значение будет в обратном порядке.
divisibleby
Возвращает True, если значение делится на аргумент.
Например:
{{ value|divisibleby:"3" }}
Если value равно 21, вывод будет True.
escape
Экранирует HTML-символы в строке. В частности, он производит следующие замены:
-
<преобразуется в< -
>преобразуется в> -
'(одинарная кавычка) преобразуется в' -
"(двойная кавычка) преобразуется в" -
&преобразуется в&
Экранирование применяется только при выводе строки, поэтому не имеет значения, где в цепочке фильтров вы поместили escape: оно всегда будет применено последним. Если вам нужно применить экранирование немедленно, используйте фильтр force_escape.
Применение escape к переменной, к которой обычно применяется автоматическое экранирование, приведет только к одному раунду экранирования. Таким образом, эта функция безопасна для использования даже в средах с автоматическим экранированием. Если вы хотите применить несколько проходов экранирования, используйте фильтр force_escape.
Например, вы можете применить escape к полям, когда autoescape отключен:
{% autoescape off %}
{{ title|escape }}
{% endautoescape %}
Устарело начиная с версии 1.10: Поведение «отложенного» применения фильтра escape устарело. В Django 2.0 оно будет изменено на немедленное применение conditional_escape().
escapejs
Экранирует символы для использования в строках JavaScript. Это не делает строку безопасной для использования в HTML, но защищает от синтаксических ошибок при использовании шаблонов для генерации JavaScript/JSON.
Например:
{{ value|escapejs }}
Если value равно "testing\r\njavascript \'string" <b>escaping</b>", вывод будет "testing\\u000D\\u000Ajavascript \\u0027string\\u0022 \\u003Cb\\u003Eescaping\\u003C/b\\u003E".
filesizeformat
Форматирует значение как «человекопонятный» размер файла (например, '13 KB', '4.1 MB', '102 bytes', и т. д.).
Например:
{{ value|filesizeformat }}
Если value равно 123456789, вывод будет 117.7 MB.
Размеры файлов и единицы СИ
Строго говоря, filesizeformat не соответствует Международной системе единиц, которая рекомендует использовать KiB, MiB, GiB и т. д., когда размер в байтах рассчитывается в степенях 1024 (что имеет место здесь). Вместо этого Django использует традиционные единицы (KB, MB, GB и т. д.), которые чаще используются.
first
Возвращает первый элемент в списке.
Например:
{{ value|first }}
Если value — список ['a', 'b', 'c'], вывод будет 'a'.
floatformat
При использовании без аргумента округляет число с плавающей точкой до одного знака после запятой — только если есть дробная часть для отображения. Например:
value | Шаблон | Вывод |
|---|---|---|
34.23234 | {{ value|floatformat }} | 34.2 |
34.00000 | {{ value|floatformat }} | 34 |
34.26000 | {{ value|floatformat }} | 34.3 |
При использовании с числовым целочисленным аргументом, floatformat округляет число до указанного количества знаков после запятой. Например:
value | Шаблон | Вывод |
|---|---|---|
34.23234 | {{ value|floatformat:3 }} | 34.232 |
34.00000 | {{ value|floatformat:3 }} | 34.000 |
34.26000 | {{ value|floatformat:3 }} | 34.260 |
Особо полезно передать 0 (ноль) в качестве аргумента, что округляет число с плавающей точкой до ближайшего целого.
value | Шаблон | Вывод |
|---|---|---|
34.23234 | {{ value|floatformat:"0" }} | 34 |
34.00000 | {{ value|floatformat:"0" }} | 34 |
39.56000 | {{ value|floatformat:"0" }} | 40 |
Если аргумент, переданный в floatformat, отрицательный, он округляет число до указанного количества знаков после запятой — только если есть дробная часть для отображения. Например:
value | Шаблон | Вывод |
|---|---|---|
34.23234 | {{ value|floatformat:"-3" }} | 34.232 |
34.00000 | {{ value|floatformat:"-3" }} | 34 |
34.26000 | {{ value|floatformat:"-3" }} | 34.260 |
Использование floatformat без аргумента эквивалентно использованию floatformat с аргументом -1.
force_escape
Применяет HTML-экранирование к строке (см. фильтр escape для получения подробностей). Этот фильтр применяется немедленно и возвращает новую, экранированную строку. Это полезно в редких случаях, когда вам нужны несколько проходов экранирования или вы хотите применить другие фильтры к результатам экранирования. Обычно следует использовать фильтр escape.
Например, если вы хотите поймать <p> HTML-элементы, созданные фильтром linebreaks:
{% autoescape off %}
{{ body|linebreaks|force_escape }}
{% endautoescape %}
get_digit
Для целого числа возвращает запрашиваемую цифру, где 1 — самая правая цифра, 2 — вторая справа и т. д. Возвращает исходное значение для неверного входного значения (если вход или аргумент не целое число, или если аргумент меньше 1). В противном случае выход всегда целое число.
Например:
{{ value|get_digit:"2" }}
Если value равно 123456789, вывод будет 8.
iriencode
Преобразует IRI (Международный идентификатор ресурса) в строку, подходящую для включения в URL. Это необходимо, если вы пытаетесь использовать строки, содержащие символы, отличные от ASCII, в URL.
Можно безопасно использовать этот фильтр для строки, которая уже прошла через фильтр urlencode.
Например:
{{ value|iriencode }}
Если value равно "?test=1&me=2", вывод будет "?test=1&me=2".
join
Объединяет список со строкой, как и в Python str.join(list)
Например:
{{ value|join:" // " }}
Если value — список ['a', 'b', 'c'], вывод будет строкой "a // b // c".
last
Возвращает последний элемент в списке.
Например:
{{ value|last }}
Если value — список ['a', 'b', 'c', 'd'], вывод будет строкой "d".
length
Возвращает длину значения. Это работает как для строк, так и для списков.
Например:
{{ value|length }}
Если value равно ['a', 'b', 'c', 'd'] или "abcd", вывод будет 4.
Фильтр возвращает 0 для неопределенной переменной.
length_is
Возвращает True, если длина значения равна аргументу, или False в противном случае.
Например:
{{ value|length_is:"4" }}
Если value равно ['a', 'b', 'c', 'd'] или "abcd", вывод будет True.
linebreaks
Заменяет переводы строк в простом тексте на соответствующие HTML-теги; одна новая строка становится HTML-разрывом строки (<br />) и новая строка, за которой следует пустая строка, становится разрывом абзаца (</p>).
Например:
{{ value|linebreaks }}
Если value равно Joel\nis a slug, то результатом будет <p>Joel<br />is a
slug</p>.
linebreaksbr
Преобразует все новые строки в куске простого текста в HTML-разрывы строк (<br />).
Например:
{{ value|linebreaksbr }}
Если value равно Joel\nis a slug, то результатом будет Joel<br />is a
slug.
linenumbers
Отображает текст с номерами строк.
Например:
{{ value|linenumbers }}
Если value равно:
one two three
то результатом будет:
1. one 2. two 3. three
ljust
Выравнивает значение по левому краю в поле заданной ширины.
Аргумент: размер поля
Например:
"{{ value|ljust:"10" }}"
Если value равно Django, то результатом будет "Django ".
lower
Преобразует строку в нижний регистр.
Например:
{{ value|lower }}
Если value равно Totally LOVING this Album!, то результатом будет totally loving this album!.
make_list
Возвращает значение, преобразованное в список. Для строки это список символов. Для целого числа аргумент преобразуется в строку Юникода перед созданием списка.
Например:
{{ value|make_list }}
Если value — строка "Joel", то результатом будет список ['J', 'o', 'e', 'l']. Если value равно 123, то результатом будет список ['1', '2', '3'].
phone2numeric
Преобразует номер телефона (возможно, содержащий буквы) в его числовой эквивалент.
Ввод не обязательно должен быть корректным номером телефона. Это с удовольствием преобразует любую строку.
Например:
{{ value|phone2numeric }}
Если value равно 800-COLLECT, то результатом будет 800-2655328.
pluralize
Возвращает множественное число, если значение не равно 1. По умолчанию это суффикс 's'.
Пример:
You have {{ num_messages }} message{{ num_messages|pluralize }}.
Если num_messages равно 1, результатом будет You have 1 message.. Если num_messages равно 2, результатом будет You have 2 messages.
Для слов, которые требуют суффикса, отличного от 's', вы можете указать альтернативный суффикс в качестве параметра фильтра.
Пример:
You have {{ num_walruses }} walrus{{ num_walruses|pluralize:"es" }}.
Для слов, которые не образуют множественное число простым добавлением суффикса, вы можете указать как единственное, так и множественное число, разделяя их запятой.
Пример:
You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}.
Примечание
Используйте blocktrans для склонения переведённых строк.
pprint
Обёртка вокруг pprint.pprint() — в основном для отладки.
random
Возвращает случайный элемент из заданного списка.
Например:
{{ value|random }}
Если value — список ['a', 'b', 'c', 'd'], результатом может быть "b".
rjust
Выравнивает значение по правому краю в поле заданной ширины.
Аргумент: размер поля
Например:
"{{ value|rjust:"10" }}"
Если value равно Django, то результатом будет " Django".
safe
Помечает строку как не требующую дальнейшего экранирования HTML перед выводом. Если автоматическое экранирование выключено, этот фильтр не имеет эффекта.
Примечание
Если вы используете цепочку фильтров, фильтр, применённый после safe, может снова сделать содержимое небезопасным. Например, следующий код выводит переменную как есть, без экранирования:
{{ var|safe|escape }}
safeseq
Применяет фильтр safe к каждому элементу последовательности. Полезно в сочетании с другими фильтрами, которые работают с последовательностями, такими как join. Например:
{{ some_list|safeseq|join:", " }}
В этом случае вы не можете использовать фильтр safe напрямую, так как он сначала преобразует переменную в строку, а не работает с отдельными элементами последовательности.
slice
Возвращает срез списка.
Использует тот же синтаксис, что и срезы списков в Python. См. http://www.diveintopython3.net/native-datatypes.html#slicinglists для введения.
Пример:
{{ some_list|slice:":2" }}
Если some_list равно ['a', 'b', 'c'], то результатом будет ['a', 'b'].
slugify
Преобразует в ASCII. Преобразует пробелы в дефисы. Удаляет символы, которые не являются буквенно-цифровыми, символами подчеркивания или дефисами. Преобразует в нижний регистр. Также удаляет пробелы в начале и конце.
Например:
{{ value|slugify }}
Если value равно "Joel is a slug", то результатом будет "joel-is-a-slug".
stringformat
Форматирует переменную в соответствии с аргументом, строковым спецификатором форматирования. Этот спецификатор использует синтаксис форматирования строк в стиле printf, за исключением того, что ведущий «%» опускается.
Например:
{{ value|stringformat:"E" }}
Если value равно 10, то результатом будет 1.000000E+01.
striptags
Например:
{{ value|striptags }}
Если value равно "<b>Joel</b> <button>is</button> a <span>slug</span>", то результатом будет "Joel is a slug".
Гарантия безопасности отсутствует
Обратите внимание, что striptags не даёт гарантий о том, что его результат является безопасным для HTML, особенно с некорректным вводом HTML. Поэтому **НИКОГДА** не применяйте фильтр safe к выводу striptags. Если вам нужно что-то более надёжное, вы можете использовать библиотеку Python bleach, в частности, её метод clean.
time
Форматирует время в соответствии с заданным форматом.
Заданный формат может быть предопределённым TIME_FORMAT, или настраиваемым форматом, аналогично фильтру date. Обратите внимание, что предопределённый формат зависит от локали.
Например:
{{ value|time:"H:i" }}
Если value эквивалентно datetime.datetime.now(), то результатом будет строка "01:23".
Ещё один пример:
Предполагая, что USE_L10N равно True и LANGUAGE_CODE равно, например, "de", то для:
{{ value|time:"TIME_FORMAT" }}
результатом будет строка "01:23:00" (спецификатор формата "TIME_FORMAT" для локали de, поставляемой с Django, равен "H:i:s").
Фильтр time будет принимать параметры в строке формата только по отношению ко времени суток, а не к дате (по понятным причинам). Если вам нужно отформатировать значение date, используйте фильтр date вместо этого (или вместе с time, если вам нужно отобразить полное значение datetime).
Есть одно исключение из этого правила: если передано значение datetime с присоединённой информацией о часовом поясе (экземпляр временной зоны datetime экземпляр), фильтр time будет принимать спецификаторы формата, относящиеся к часовому поясу: 'e', 'O', 'T' и 'Z'.
При использовании без строки формата используется спецификатор формата TIME_FORMAT:
{{ value|time }}
эквивалентно:
{{ value|time:"TIME_FORMAT" }}
В более старых версиях настройка TIME_FORMAT (без локализации) всегда используется, если строка формата не указана.
timesince
Форматирует дату как время, прошедшее с этой даты (например, «4 дня, 6 часов»).
Принимает необязательный аргумент, являющийся переменной, содержащей дату для использования в качестве точки сравнения (без аргумента точка сравнения — сейчас). Например, если blog_date — экземпляр даты, представляющий полночь 1 июня 2006 года, а comment_date — экземпляр даты для 08:00 1 июня 2006 года, то следующее вернёт «8 часов»:
{{ blog_date|timesince:comment_date }}
Сравнение даты без смещения и даты со смещением вернёт пустую строку.
Минуты — самая мелкая единица, и «0 минут» будет возвращено для любой даты, которая находится в будущем относительно точки сравнения.
timeuntil
Аналогично timesince, за исключением того, что оно измеряет время от сейчас до заданной даты или даты и времени. Например, если сегодня 1 июня 2006 года, а conference_date — экземпляр даты, содержащий 29 июня 2006 года, то {{ conference_date|timeuntil }} вернёт «4 недели».
Принимает необязательный аргумент, являющийся переменной, содержащей дату для использования в качестве точки сравнения (вместо сейчас). Если from_date содержит 22 июня 2006 года, то следующее вернёт «1 неделю»:
{{ conference_date|timeuntil:from_date }}
Сравнение даты без смещения и даты со смещением вернёт пустую строку.
Минуты — самая мелкая единица, и «0 минут» будет возвращено для любой даты, которая находится в прошлом относительно точки сравнения.
title
Преобразует строку в заголовок, делая слова начинающимися с заглавной буквы, а остальные символы — строчными. Этот тег не пытается сохранять «тривиальные слова» в нижнем регистре.
Например:
{{ value|title }}
Если value является "my FIRST post", результат будет "My First Post".
truncatechars
Усекает строку, если она длиннее указанного числа символов. Усечённые строки будут заканчиваться переводимой последовательностью многоточия («…»).
Аргумент: Количество символов для усечения
Например:
{{ value|truncatechars:9 }}
Если value равно "Joel is a slug", результат будет "Joel i...".
truncatechars_html
Аналогично truncatechars, за исключением того, что он учитывает HTML-теги. Любые открытые теги в строке, которые не закрыты до точки усечения, закрываются сразу после усечения.
Например:
{{ value|truncatechars_html:9 }}
Если value равно "<p>Joel is a slug</p>", результат будет "<p>Joel i...</p>".
В HTML-контенте сохраняются новые строки.
truncatewords
Усекает строку после определённого количества слов.
Аргумент: Количество слов для усечения
Например:
{{ value|truncatewords:2 }}
Если value равно "Joel is a slug", результат будет "Joel is ...".
Новые строки внутри строки будут удалены.
truncatewords_html
Аналогично truncatewords, за исключением того, что он учитывает HTML-теги. Любые открытые теги в строке, которые не закрыты до точки усечения, закрываются сразу после усечения.
Это менее эффективно, чем truncatewords, поэтому следует использовать только при передаче HTML-текста.
Например:
{{ value|truncatewords_html:2 }}
Если value равно "<p>Joel is a slug</p>", результат будет "<p>Joel is ...</p>".
В HTML-контенте сохраняются новые строки.
unordered_list
Рекурсивно обрабатывает самовложенный список и возвращает HTML-список без маркированного списка — БЕЗ открывающих и закрывающих тегов <ul>.
Предполагается, что список имеет правильный формат. Например, если var содержит ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']], то {{ var|unordered_list }} вернёт:
<li>States
<ul>
<li>Kansas
<ul>
<li>Lawrence</li>
<li>Topeka</li>
</ul>
</li>
<li>Illinois</li>
</ul>
</li>
upper
Преобразует строку в верхний регистр.
Например:
{{ value|upper }}
Если value равно "Joel is a slug", результат будет "JOEL IS A SLUG".
urlencode
Экранирует значение для использования в URL.
Например:
{{ value|urlencode }}
Если value равно "https://www.example.org/foo?a=b&c=d", результат будет "https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd".
Можно указать необязательный аргумент, содержащий символы, которые не следует экранировать.
Если не указан, символ ‘/’ считается безопасным. Пустая строка может быть указана, когда все символы должны быть экранированы. Например:
{{ value|urlencode:"" }}
Если value равно "https://www.example.org/", результат будет "https%3A%2F%2Fwww.example.org%2F".
urlize
Преобразует URL-адреса и адреса электронной почты в тексте в нажимаемые ссылки.
Этот тег шаблона работает с ссылками, начинающимися с http://, https://, или www.. Например, https://goo.gl/aia1t будет преобразован, но goo.gl/aia1t нет.
Он также поддерживает ссылки только на домены, заканчивающиеся одним из оригинальных доменных имен верхнего уровня (.com, .edu, .gov, .int, .mil, .net, и .org). Например, djangoproject.com преобразуется.
Ссылки могут иметь конечные знаки препинания (точки, запятые, закрытые скобки) и начальные знаки препинания (открывающие скобки), и urlize по-прежнему сделает то, что нужно.
Ссылки, сгенерированные urlize, имеют добавленный атрибут rel="nofollow".
Например:
{{ value|urlize }}
Если value равно "Check out www.djangoproject.com", результат будет "Check out <a href="http://www.djangoproject.com"
rel="nofollow">www.djangoproject.com</a>".
В дополнение к веб-ссылкам, urlize также преобразует адреса электронной почты в mailto: ссылки. Если value равно "Send questions to foo@example.com", результат будет "Send questions to <a href="mailto:foo@example.com">foo@example.com</a>".
Фильтр urlize также принимает необязательный параметр autoescape. Если autoescape равно True, текст ссылки и URL-адреса будут экранированы с помощью встроенного фильтра Django escape. Значение по умолчанию для autoescape равно True.
Примечание
Если urlize применяется к тексту, уже содержащему HTML-разметку, результат не будет ожидаемым. Применяйте этот фильтр только к простому тексту.
urlizetrunc
Преобразует URL-адреса и адреса электронной почты в нажимаемые ссылки, как и urlize, но усекает URL-адреса, длина которых превышает заданный лимит символов.
Аргумент: Количество символов, до которых должен быть усечён текст ссылки, включая многоточие, которое добавляется, если усечение необходимо.
Например:
{{ value|urlizetrunc:15 }}
Если value равно "Check out www.djangoproject.com", результатом будет 'Check out <a href="http://www.djangoproject.com"
rel="nofollow">www.djangopr...</a>'.
Как и в случае с urlize, этот фильтр следует применять только к простому тексту.
wordcount
Возвращает количество слов.
Например:
{{ value|wordcount }}
Если value равно "Joel is a slug", результат будет 4.
wordwrap
Обёртывает слова на заданной длине строки.
Аргумент: Количество символов, на котором нужно обёртывать текст.
Например:
{{ value|wordwrap:5 }}
Если value равно Joel is a slug, результат будет:
Joel is a slug
yesno
Сопоставляет значения для True, False, и (необязательно) None, со строками «да», «нет», «возможно» или с пользовательским сопоставлением, переданным как список, разделённый запятыми, и возвращает одну из этих строк в зависимости от значения:
Например:
{{ value|yesno:"yeah,no,maybe" }}
| Значение | Аргумент | Результаты |
|---|---|---|
True | yes | |
True | "yeah,no,maybe" | yeah |
False | "yeah,no,maybe" | no |
None | "yeah,no,maybe" | maybe |
None | "yeah,no" |
no (преобразует None в False если нет сопоставления для None) |
Международные теги и фильтры
i18n
Эта библиотека позволяет указывать переводимый текст в шаблонах. Для её активации установите USE_I18N в True, а затем загрузите её с помощью {% load i18n %}.
См. Международная локализация: в коде шаблона.
l10n
Эта библиотека предоставляет контроль над локализацией значений в шаблонах. Вам нужно только загрузить библиотеку с помощью {% load l10n %}, но часто вы устанавливаете USE_L10N в True, чтобы локализация была активной по умолчанию.
См. Управление локализацией в шаблонах.
tz
Эта библиотека предоставляет контроль над преобразованием часовых поясов в шаблонах. Как и l10n, вам нужно только загрузить библиотеку с помощью {% load tz %}, но вы обычно также устанавливаете USE_TZ в True, чтобы преобразование во время местного времени происходило по умолчанию.
См. Работа с часовыми поясами в шаблонах.
Другие библиотеки тегов и фильтров
django.contrib.humanize
Набор фильтров Django для шаблонов, полезных для добавления «человеческого» аспекта к данным. См. django.contrib.humanize.
static
static
Для ссылки на статические файлы, сохранённые в STATIC_ROOT, Django поставляется с тегом шаблона static. Если приложение django.contrib.staticfiles установлено, тег будет обслуживать файлы с помощью метода url() хранилища, указанного в STATICFILES_STORAGE. Например:
{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />
Он также может использовать стандартные переменные контекста, например, предполагая, что переменная user_stylesheet передана в шаблон:
{% load static %}
<link rel="stylesheet" href="{% static user_stylesheet %}" type="text/css" media="screen" />
Если вам нужно получить статический URL без его отображения, вы можете использовать немного другой вызов:
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>
Использование шаблонов Jinja2?
См. Jinja2 для получения информации об использовании тега static с Jinja2.
В более старых версиях вам нужно было использовать {% load static from staticfiles %} в вашем шаблоне, чтобы отобразить файлы из хранилища, определённого в STATICFILES_STORAGE. Это больше не требуется.
get_static_prefix
Вы должны предпочесть тег шаблона static, но если вам нужно больше контроля над тем, где и как STATIC_URL вставляется в шаблон, вы можете использовать тег шаблона get_static_prefix:
{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
Также есть второй вариант, который вы можете использовать, чтобы избежать дополнительной обработки, если вам нужно значение несколько раз:
{% load static %}
{% get_static_prefix as STATIC_PREFIX %}
<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
get_media_prefix
Аналогично тегу get_static_prefix, get_media_prefix заполняет переменную шаблона префиксом медиа MEDIA_URL, например:
{% load static %}
<body data-media-url="{% get_media_prefix %}">
Хранение значения в атрибуте данных гарантирует его корректное экранирование, если мы хотим использовать его в контексте JavaScript.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.10/ref/templates/builtins/