Встроенные теги и фильтры шаблонов ¶
В этом документе описаны встроенные теги и фильтры шаблонов в Django. Рекомендуется использовать автоматическую документацию , если таковая имеется, поскольку она также будет включать документацию для любых потенциально установленных пользовательских фильтров или тегов.
Справочник по встроенным тегам ¶
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 %}
В некоторых случаях может быть желательно обратиться к текущему значению цикла без перехода к следующему значению. Для этого дайте тегу имя через "as", например:{% cycle %}
{% 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
в своем контексте, и его значение будет соответствовать значению окружающего class
тега <tr>
. Если нам не удалось добавить ключевое слово silent
, row1
и row2
была бы отображаться в виде обычного текста, вне элемента <tr>
.
Когда ключевое слово silent
используется в определении цикла, это автоматически применяется ко всем последующим использованиям этого cycle
конкретного тега . В следующем шаблоне ничего не отображается , даже если второй вызов не указывает :{% cycle %}
silent
{% cycle 'row1' 'row2' as rowcolors silent %}
{% cycle rowcolors %}
Можно использовать тег resetcycle
для сброса тега к его первому значению в следующий раз, когда он появится.{% cycle %}
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 и не содержит числовое значение 0). Ничего не отображает, если все переданные значения являются «ложными».
Пример использования:
{% 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 %}
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
¶
Тег оценивает переменную, и если переменная имеет значение (то есть существует, не пуста и не содержит логического значения false), отображается содержимое блока:{% if %}
True
{% 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
(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 %}
Сложные выражения ¶
Все вышеперечисленное можно комбинировать в сложные выражения. Для таких выражений может быть важно знать, как сгруппированы операторы при оценке выражения, то есть применяемые правила приоритета. Приоритет операторов, от низшего к высшему, находится в следующем порядке:
or
and
not
in
==
,!=
,<
,>
,<=
,>=
(Это в точности соответствует поведению 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
¶
Не рекомендуется, начиная с версии 3.1.
{% ifequal a b %} ... {% endifequal %}
это устаревший способ записи
. Аналогичным образом заменяется на .{% if a == b %} ... {% endif %}
{% ifnotequal a b %} ...
{% endifnotequal %}
{% if a != b %} ... {% endif %}
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
скомпилированный объект в вашем контексте.
Кроме того, переменная может быть повторением имен шаблонов, и в этом случае будет использоваться первая, которая может быть загружена, в соответствии с
select_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 %}
Заметка
Тег include
следует рассматривать как реализацию «визуализации этого подшаблона и включения результирующего HTML», а не «синтаксического анализа этого подшаблона и включения его содержимого, как если бы он был частью родительского». Это означает, что между включенными шаблонами нет общего состояния, каждое включение является предметом полностью автономного процесса рендеринга.
Перед включением блоки оцениваются . Это означает, что шаблон, который включает блоки из другого, будет содержать блоки, которые уже были оценены и созданы , а не блоки, которые могут быть перегружены, например, с помощью шаблона расширения.
Добавлена поддержка повторения имен шаблонов.
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" %}
Обратите внимание, что вы можете использовать обратную косую черту для строки формата, если хотите использовать «сырое» значение. В этом примере «f» и «o» экранируются обратной косой чертой, в противном случае каждая из них будет интерпретироваться как строка формата для отображения года и времени соответственно:
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 %}
blocktranslate
{% now "Y" as current_year %}
{% blocktranslate %}Copyright {{ current_year }}{% endblocktranslate %}
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
- Япония
- Токио: 33000000
Вы можете использовать тег для группировки списка городов по странам. Это делает следующий фрагмент кода шаблона:{% 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
) групповых объектов . Объекты группы - это экземпляры, namedtuple()
содержащие два поля:
grouper
, элемент, который использовался для группировки (например, строка «Индия» или «Япония»).list
, список всех элементов группы (например, список всех имеющихся городовcountry='India'
).
В качестве продукта объектов предыдущий пример также можно записать следующим образом:{% regroup %}
namedtuple()
{% regroup cities by country as country_list %}
<ul>
{% for country, local_cities in country_list %}
<li>{{ country }}
<ul>
{% for city in local_cities %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
Обратите внимание, что не сортирует то, что он получает! Наш пример основан на том, что список сначала сортируется по . Если бы список не был отсортирован по странам, группировка наивно отображала бы более одной группы на страну. Например, если список содержал это (обратите внимание, что страны не сгруппированы):{% regroup %}
cities
country
cities
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
- Япония
- Токио: 33000000
Самое простое решение этой проблемы - убедиться на уровне представления, что данные отсортированы по любым критериям, которые вы хотите использовать для отображения.
Другое решение - отсортировать данные в шаблоне с помощью фильтра dictsort
, если данные состоят из списка словарей:
{% regroup cities|dictsort:"country" by country as country_list %}
Группировка по другим свойствам ¶
Любой поиск по атрибутам, принятый в шаблонах, может использоваться как атрибут группировки для тега regroup
, включая методы, атрибуты, ключи словаря и элементы списка. Например, если поле «страна» является внешним ключом для класса с атрибутом «описание», вы можете написать:
{% regroup cities by country.description as country_list %}
Или, если country
это поле, содержащее choices ( choices
), у него будет метод, get_FOO_display()
доступный в качестве атрибута, позволяющий группировать по видимой строке, а не по выбранному ключу:
{% regroup cities by get_country_display as country_list %}
{{ country.grouper }}
теперь содержит часть значений вариантов, choices
а не их ключ.
resetcycle
¶
Сбрасывает предыдущий цикл, чтобы он начинался с первого элемента при следующем вхождении. Без параметров повторно инициализирует последнее, определенное в шаблоне.{% resetcycle %}
{% cycle %}
Пример использования:
{% for coach in coach_list %}
<h1>{{ coach.name }}</h1>
{% for athlete in coach.athlete_set.all %}
<p class="{% cycle 'odd' 'even' %}">{{ athlete.name }}</p>
{% endfor %}
{% resetcycle %}
{% endfor %}
В этом примере создается следующий HTML-код:
<h1>José Mourinho</h1>
<p class="odd">Thibaut Courtois</p>
<p class="even">John Terry</p>
<p class="odd">Eden Hazard</p>
<h1>Carlo Ancelotti</h1>
<p class="odd">Manuel Neuer</p>
<p class="even">Thomas Müller</p>
Обратите внимание, как заканчивается первый блок class="odd"
и начинается новый блок class="odd"
. Без тега второй блок начался бы с .{% resetcycle %}
class="even"
Также можно сбросить cycle
именованные теги :
{% for item in list %}
<p class="{% cycle 'odd' 'even' as stripe %} {% cycle 'major' 'minor' 'minor' 'minor' 'minor' as tick %}">
{{ item.data }}
</p>
{% ifchanged item.category %}
<h1>{{ item.category }}</h1>
{% if not forloop.first %}{% resetcycle tick %}{% endif %}
{% endifchanged %}
{% endfor %}
В этом примере у нас есть как чередующиеся четные / нечетные строки, так и «основная» строка через каждые пять строк. При изменении категории сбрасывается только цикл пяти строк.
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 . Это может быть буквальная строка в кавычках или контекстная переменная. Дополнительные параметры являются необязательными и предоставляются в виде значений, разделенных пробелами, которые будут использоваться в качестве параметров URL-адреса. В приведенном выше примере показано, как передавать позиционные параметры. Также можно использовать синтаксис ключевых слов
{% url 'some-url-name' arg1=v1 arg2=v2 %}
Не смешивайте позиционный синтаксис с синтаксисом ключевых слов в одном вызове. Должны присутствовать все параметры, необходимые для конфигурации URL.
Например, предположим, что у вас есть представление ,, app_views.client
чья конфигурация URL-адреса принимает идентификатор клиента (вот client()
метод в файле представлений app_views.py
). Строка конфигурации URL-адреса может выглядеть так:
path('client/<int:id>/', app_views.client, name='app-views-client')
Если конфигурация URL-адреса этого приложения включена в конфигурацию URL-адреса проекта по следующему пути:
path('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 с пространством имен будет следовать, в том числе использования флагов , предусмотренного контекст в качестве текущего приложения.
Предупреждение
Не забудьте name
заключить шаблон URL в кавычки, иначе значение будет интерпретировано как переменная контекста!
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
в переменной. Это может быть полезно, например, в blocktranslate
таких случаях:
{% widthratio this_value max_value max_width as width %}
{% blocktranslate %}The width is: {{ width }}{% endblocktranslate %}
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
содержит , то результат будет ."J'utilise Django"
"J\'utilise Django"
capfirst
¶
Делает первый символ значения заглавным. Если первый символ не является буквой, этот фильтр не действует.
Например :
{{ value|capfirst }}
Если value
содержит "django"
, то результат будет "Django"
.
center
¶
Центрирует значение в поле заданной ширины.
Например :
"{{ value|center:"15" }}"
Если value
содержит "Django"
, то результат будет ." Django "
cut
¶
Удаляет все значения параметров из строки для фильтрации.
Например :
{{ value|cut:" " }}
Если value
содержит , то результат будет ."Chaîne avec des espaces"
"Chaîneavecdesespaces"
date
¶
Форматирует дату в указанном формате.
Использует формат, аналогичный функции date()
PHP ( https://php.net/date ) с некоторыми отличиями.
Заметка
Эти символы формата не используются в Django вне шаблонов. Они были разработаны для совместимости с PHP, чтобы облегчить переход для писателей, привыкших к этому языку.
Доступные форматные строки:
Форматировать символ | Описание | Пример дисплея |
---|---|---|
День | ||
d |
День месяца, 2 цифры, при необходимости дополненные нулем. | '01' в '31' |
j |
День месяца без ведущих нулей. | '1' в '31' |
D |
День недели, трехзначное сокращение. | 'ven' |
l |
День недели, полный текст. | 'vendredi' |
S |
Английский порядковый суффикс дня месяца, состоящий из 2 знаков. | 'st' , 'nd' , 'rd' Или'th' |
w |
День недели, число без нуля в начале. | '0' (Воскресенье) - '6' (суббота) |
z |
День года. | 1 в 366 |
Неделя | ||
W |
Номер недели в году согласно ISO-8601, недели, начинающиеся с понедельника. | 1 , 53 |
Месяц | ||
m |
Месяц, 2 цифры, при необходимости с нуля в начале. | '01' в '12' |
n |
Месяц (цифры) без нуля в начале. | '1' в '12' |
M |
Месяц, трехзначное сокращение. | 'jan' |
b |
Месяц, трехзначное сокращение в нижнем регистре. | 'jan' |
E |
Месяц, альтернативное представление, специфичное для активного языка, обычно используется для дат в расширенном формате. | 'listopada' (для польского, в отличие от 'Listopad' ) |
F |
Месяц в длинном текстовом формате. | 'janvier' |
N |
Аббревиатура месяца в стиле Associated Press. Расширение владельца. | 'jan.' , 'fév.' , 'mars' ,'mai' |
t |
Количество дней в указанном месяце. | 28 в 31 |
Год | ||
y |
Год на 2-х цифрах. | '99' |
Y |
Год в 4-значном формате. | '1999' |
L |
Логическое значение, указывающее, является ли этот год високосным. | True или False |
o |
Год согласно ISO-8601 (W), подсчет недель с использованием високосной недели. См. Y для более обычного формата года. | '1999' |
Час | ||
g |
Часовой 12-часовой формат без ведущих нулей. | '1' в '12' |
G |
Часовой, 24-часовой формат без ведущих нулей. | '0' в '23' |
h |
Время в 12-часовом формате. | '01' в '12' |
H |
Время в 24-часовом формате. | '00' в '23' |
i |
Протокол. | '00' в '59' |
s |
Секунды, 2 цифры с нулем в начале. | '00' в '59' |
u |
Микросекунды. | 000000 в 999999 |
a |
'a.m.' или 'p.m.' (обратите внимание, что это немного отличается от отображения PHP наличием точек, соответствующих стилю Associated Press). |
'a.m.' |
A |
'AM' или 'PM' . |
'AM' |
f |
Час в формате часов и минут более 12 часов, без отображения минут, если они равны 0. Собственное расширение. | '1' , '1:30' |
P |
Час в 12-часовом формате, минуте и формате «am» / «pm», без минут, если они равны 0; где возможно, появляются каналы «полночь» и «полдень». Расширение владельца. | '1 a.m.' , , , ,'1:30 p.m.' 'minuit' 'midi' '12:30 p.m.' |
Часовой пояс | ||
e |
Название часового пояса. В зависимости от даты / времени могут отображаться разные форматы или даже пустая строка. | '' , 'GMT' , '-500' , 'US/Eastern' , И т.д. |
I |
Летнее время, указание, активно оно или нет. | '1' или '0' |
O |
Разница в часах со средним временем по Гринвичу. | '+0200' |
T |
Часовой пояс машины. | 'EST' , 'MDT' |
Z |
Смещение часового пояса в секундах. Смещение для часовых поясов к западу от UTC всегда отрицательно, а для часовых поясов к востоку от UTC - положительно. | -43200 в 43200 |
Дата час | ||
c |
Формат ISO 8601 (примечание: в отличие от других форматов, таких как «Z», «O» или «r», формат «c» не добавляет смещение часового пояса, если значение является наивной датой / временем (см. datetime.tzinfo ). |
2008-01-02T10:30:00.000123+02:00 или 2008-01-02T10:30:00.000123 если дата / время наивны |
r |
Дата отформатирована в соответствии с RFC 5322 . | 'ven, 22 Nov 2013 18:41:16 +0100' |
U |
Секунды с момента начального времени Unix (1 января 1970 г., 00:00:00 UTC). |
Например :
{{ value|date:"D d M Y" }}
Если value
объект datetime
(например, результат datetime.datetime.now()
), результатом будет текст .'mer 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 }}
Продукт ( локаль формат является ). «D» и «e» экранируются обратной косой чертой, потому что в противном случае они считались бы маркерами формата, показывающими день и имя часового пояса соответственно.9 de Enero de 2008
DATE_FORMAT
es
r'j \d\e F \d\e Y'
Вы можете комбинировать date
с фильтром, time
чтобы получить полное представление значения datetime
, например. :
{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}
default
¶
Если value
оценивается в False
, default
отображается параметр. В противном случае value
отображается значение .
Например :
{{ value|default:"nothing" }}
Если value
содержит ""
(пустую строку), результат будет nothing
.
default_if_none
¶
Если (и только если) value
верно None
, default
отображается параметр. В противном случае value
отображается значение .
Обратите внимание: если передана пустая строка, значение по умолчанию использоваться не будет . Используйте фильтр, 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
, результат будет
escape
¶
Экранирует HTML-код. В частности, он выполняет следующие замены:
<
конвертируется в<
>
конвертируется в>
'
(апостроф) преобразуется в'
"
(кавычка) преобразуется в"
&
конвертируется в&
Применение escape
к переменной, которая обычно подвергается автоматическому экранированию результата, будет выполнять только дополнительную проверку escape. Таким образом, эту функцию можно без проблем использовать даже в контексте автоматического выхода. Если вы хотите форсировать выхлоп во всех случаях, используйте фильтр force_escape
.
Например, вы можете применить escape
к некоторым полям, когда autoescape
неактивно:
{% autoescape off %}
{{ title|escape }}
{% endautoescape %}
escapejs
¶
Экранирует символы в содержимом JavaScript. Это не делает текст надежным для использования в литеральных шаблонах HTML или JavaScript, но защищает от синтаксических ошибок при использовании шаблонов для генерации JavaScript / JSON.
Например :
{{ value|escapejs }}
Если value
содержит , то результат будет ."testing\r\njavascript 'string\" <b>escaping</b>"
"testing\\u000D\\u000Ajavascript \\u0027string\\u0022 \\u003Cb\\u003Eescaping\\u003C/b\\u003E"
filesizeformat
¶
Форматирует значение как удобочитаемый размер файла (например , и т. Д.).'13 Kio'
'4.1 Mio'
'102 octets'
Например :
{{ value|filesizeformat }}
ЕСЛИ value
содержит 123456789, результат будет .117.7 Mio
Размеры файлов и единицы СИ
Строго говоря, filesizeformat
не соответствует Международной системе единиц, которая рекомендует использовать KiB, MiB, GiB и т. Д. когда размер байта вычисляется в степени 1024 (как здесь). Django вместо этого использует традиционные имена единиц (КБ, МБ, ГБ и т. Д.), Соответствующие более часто используемым именам (примечание редактора: французский перевод использует префиксы SI Kio, Mio и т. Д.).
first
¶
Возвращает первый элемент в списке.
Например :
{{ value|first }}
Если value
содержит список , то результат будет .['a', 'b', 'c']
'a'
floatformat
¶
Если параметр отсутствует, этот фильтр округляет число с плавающей запятой до одной цифры после десятичной запятой, но только если есть десятичная часть для отображения. Например :
valeur |
шаблон | дисплей |
---|---|---|
34.23234 |
{{ valeur|floatformat }} |
34,2 |
34.00000 |
{{ valeur|floatformat }} |
34 |
34.26000 |
{{ valeur|floatformat }} |
34,3 |
Когда передается целочисленный параметр, floatformat
округляет число до количества десятичных знаков, указанного параметром. Например :
valeur |
шаблон | дисплей |
---|---|---|
34.23234 |
{{ valeur|floatformat:3 }} |
34,232 |
34.00000 |
{{ valeur|floatformat:3 }} |
34,000 |
34.26000 |
{{ valeur|floatformat:3 }} |
34,260 |
Может быть особенно полезно передать параметр 0 (ноль), который округляет число с плавающей запятой до ближайшего целого числа.
valeur |
шаблон | дисплей |
---|---|---|
34.23234 |
{{ valeur|floatformat:"0" }} |
34 |
34.00000 |
{{ valeur|floatformat:"0" }} |
34 |
39.56000 |
{{ valeur|floatformat:"0" }} |
40 |
Если переданный параметр floatformat
отрицательный, число будет округлено до указанного количества десятичных знаков, но только если есть десятичная часть для отображения. Например :
valeur |
шаблон | дисплей |
---|---|---|
34.23234 |
{{ valeur|floatformat:"-3" }} |
34,232 |
34.00000 |
{{ valeur|floatformat:"-3" }} |
34 |
34.26000 |
{{ valeur|floatformat:"-3" }} |
34,260 |
Использование floatformat
без параметров эквивалентно использованию floatformat
с параметром -1
.
В более старых версиях отрицательный ноль -0
возвращался для отрицательных чисел, округляемых до нуля.
force_escape
¶
Применяет экранирование HTML к строке ( escape
подробности см. В фильтре ). Этот фильтр применяется немедленно и возвращает новую экранированную строку. Это может быть полезно в том редком случае, когда вам нужно несколько последовательных экранирований или вы хотите применить другие фильтры к экранированному результату. Обычно достаточно использовать фильтр escape
.
Например, если вы хотите избежать тегов HTML, <p>
созданных фильтром linebreaks
:
{% autoescape off %}
{{ body|linebreaks|force_escape }}
{% endautoescape %}
get_digit
¶
Для целого числа возвращает указанную цифру, где 1 - крайняя правая цифра, 2 - вторая правая цифра и т. Д. Возвращает исходное значение, если входные данные недействительны (если значение или параметр не являются целыми числами или если параметр меньше 1). В противном случае результат всегда целое число.
Например :
{{ value|get_digit:"2" }}
ЕСЛИ value
содержит 123456789
, то результат будет 8
.
iriencode
¶
Преобразует интернационализированный идентификатор ресурса (IRI) в строку, которая может быть включена в URL-адрес. Это необходимо при попытке вставить в URL-адреса строки, содержащие символы, отличные от ASCII.
Вы можете легко использовать этот фильтр для канала, который уже прошел через фильтр urlencode
.
Например :
{{ value|iriencode }}
Если value
содержит "?test=1&moi=2"
, то результат будет "?test=1&moi=2"
.
join
¶
Объединяет элементы списка со строкой привязки, как это делает Python с str.join(list)
.
Например :
{{ value|join:" // " }}
Если value
содержит список , то результат будет .['a', 'b', 'c']
"a // b // c"
json_script
¶
Безопасно преобразует объект Python в JSON, заключенный в тег <script>
, для использования из JavaScript.
Параметр : HTML "id" тега <script>
.
Например :
{{ value|json_script:"hello-data" }}
Если value
содержит словарь , результатом будет:{'hello': 'world'}
<script id="hello-data" type="application/json">{"hello": "world"}</script>
Полученные данные можно получить в JavaScript следующим образом:
const value = JSON.parse(document.getElementById('hello-data').textContent);
XSS-атак можно избежать за счет экранирования символов «<», «>» и «&». Например, если value
содержит , результатом будет:{'hello': 'world</script>&'}
<script id="hello-data" type="application/json">{"hello": "world\\u003C/script\\u003E\\u0026amp;"}</script>
Это совместимо со строгой политикой безопасности контента, которая запрещает выполнение скриптов на страницах. Он также поддерживает четкое разделение пассивных данных и исполняемого кода.
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
содержит , то результат будет ."Joël\nest une limace"
<p>Joël<br>est une limace</p>
linebreaksbr
¶
Преобразует все разрывы строк в текстовом содержимом в разрывы строк HTML ( <br>
).
Например :
{{ value|linebreaksbr }}
Если value
содержит , то результат будет ."Joël\nest une limace"
Joël<br>est une limace
linenumbers
¶
Отображает текст по нумерации его строк.
Например :
{{ value|linenumbers }}
Если value
содержит:
one
two
three
результат будет:
1. one
2. two
3. three
ljust
¶
Выравнивает значение по левому краю в поле заданной ширины.
Параметр: размер поля
Например :
"{{ value|ljust:"10" }}"
Если value
содержит "Django"
, то результат будет ."Django "
lower
¶
Преобразует строку в нижнем регистре.
Например :
{{ value|lower }}
Если value
содержит , то результат будет .J'aime FOLLEMENT cet album!
j'aime follement cet album!
make_list
¶
Возвращает значение, преобразованное в список. Для строки это будет список символов. Для целого числа параметр сначала вставляется в строку, прежде чем составлять ее список.
Например :
{{ value|make_list }}
Если value
содержит строку "Joël"
, результатом будет список . Если он содержит , результатом будет список .['J', 'o', 'ë', 'l']
value
123
['1', '2', '3']
phone2numeric
¶
Преобразует номер телефона (который может содержать буквы) в его числовой эквивалент.
В качестве начального числа необязательно должен быть действующий номер телефона. Любая строка символов будет без промедления преобразована.
Например :
{{ value|phone2numeric }}
Если value
равно 800-COLLECT
, то результат будет 800-2655328
.
pluralize
¶
Возвращает суффикс множественного числа , если значение отличается от 1
, '1'
или объект длины 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" }}.
Заметка
Используется blocktranslate
для множественного числа переведенных строк.
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. См. Введение на https://www.diveinto.org/python3/native-datatypes.html#slicinglists .
Пример:
{{ some_list|slice:":2" }}
Если some_list
содержит , то результат будет .['a', 'b', 'c']
['a', 'b']
slugify
¶
Преобразует в ASCII. Преобразует пробелы в тире. Удаляет символы, не являющиеся буквенно-цифровыми, знаками подчеркивания или тире. Преобразует в нижний регистр. Также удаляются пробелы в начале и конце строки.
Например :
{{ value|slugify }}
Если value
содержит , то результат будет ."Joël est une limace"
joel-est-une-limace
stringformat
¶
Форматирует переменную на основе параметра, спецификации строки формата. Здесь используется синтаксис форматирования строк в стиле printf , за исключением начального символа «%».
Например :
{{ value|stringformat:"E" }}
ЕСЛИ value
содержит 10
, то результат будет 1.000000E+01
.
striptags
¶
Делает все возможное для удаления всех тегов HTML [X].
Например :
{{ value|striptags }}
Если value
содержит , то результат будет ."<b>Joël</b> <button>est</button> une <span>limace</span>"
"Joël est une limace"
Нет гарантии безопасности
Обратите внимание, что striptags
нет гарантии, что результирующий контент больше не будет содержать разметку HTML, особенно если входящий контент не является допустимым кодом HTML. Поэтому НИКОГДА не применяйте фильтр safe
к контенту из striptags
. Если вы ищете более надежное решение, вы можете использовать библиотеку Python bleach
, особенно ее чистый метод .
time
¶
Форматирует время в указанном формате.
Указанный формат может быть предопределенным форматом TIME_FORMAT
или настраиваемым форматом, как для фильтра date
. Обратите внимание, что предопределенный формат зависит от активного языка.
Например :
{{ value|time:"H:i" }}
Если value
эквивалентно datetime.datetime.now()
, результат будет "01:23"
.
Обратите внимание, что вы можете использовать обратную косую черту для строки формата, если хотите использовать «сырое» значение. В этом примере «h» и «m» экранируются обратной косой чертой, в противном случае каждая из них будет интерпретирована как строка формата для отображения часа и месяца соответственно:
{% value|time:"H\h i\m" %}
Отображаемый результат: «01ч 23м».
Другой пример :
Если предположить , что USE_L10N
это True
и что это LANGUAGE_CODE
относится, например "de"
, то для:
{{ value|time:"TIME_FORMAT" }}
результат будет "01:23"
(спецификатор формата "TIME_FORMAT"
локали , de
предоставленный Django, содержит "H:i"
).
Фильтр time
принимает параметры только для времени дня в строке формата, но не для даты. Если вам нужно отформатировать дату, используйте фильтр date
(возможно, с, time
если вам нужно получить datetime
полное значение ).
Существует одно исключения из вышеуказанного правила: когда он принимает значение , datetime
содержащее информацию о временной зоне (экземпляр в datetime
сознании ), фильтр time
принимает индикаторы формата , связанные с часовыми поясами 'e'
, 'O'
, 'T'
и 'Z'
.
Если строка формата не указана, используется формат TIME_FORMAT
:
{{ value|time }}
идентичен:
{{ value|time:"TIME_FORMAT" }}
timesince
¶
Форматирует дату относительно этой даты (например, «4 дня, 6 часов»).
Принимает необязательный параметр в качестве переменной, содержащей дату для использования в качестве точки сравнения (без параметров точкой сравнения является сейчас ). Например, если blog_date
это экземпляр даты, представляющий полночь 1 июня 2006 г., и comment_date
экземпляр даты, представляющий 1 июня 2006 г. в 8:00 утра, следующий код вернет «8 часов»:
{{ blog_date|timesince:comment_date }}
При сравнении наивной и сознательной (относительно часового пояса) даты / времени возвращается пустая строка.
Минуты - это наименьшая используемая единица, и «0 минут» возвращается для любой даты в будущем на основе точки сравнения.
timeuntil
¶
Аналогично timesince
, за исключением того, что он измеряет время от текущего момента до указанной даты или даты / времени. Например, если это 1 июня 2006 г., и conference_date
экземпляр даты, содержащий 29 июня 2006 г., вернет «4 недели».{{ conference_date|timeuntil }}
Принимает необязательный параметр как переменные , содержащий дату , чтобы использовать в качестве точки сравнения (вместо того , в настоящее время ). Если from_date
содержит 22 июня 2006 г., следующий код вернет "1 неделя":
{{ conference_date|timeuntil:from_date }}
При сравнении наивной и сознательной (относительно часового пояса) даты / времени возвращается пустая строка.
Минуты - это наименьшая используемая единица, и для любой даты в прошлом возвращается «0 минут» на основе точки сравнения.
title
¶
Преобразует строку в заголовок в английском стиле, используя заглавную первую букву каждого слова и строчные остальные буквы. Этот тег не пытается сохранить строчные буквы слова «утилиты».
Например :
{{ value|title }}
Если value
содержит , то результат будет ."mon PREMIER article"
"Mon Premier Article"
truncatechars
¶
Обрезать строку, если она длиннее указанного количества символов. Усеченные строки заканчиваются символом многоточия («…»).
Параметр: максимальное количество символов результата
Например :
{{ value|truncatechars:7 }}
Если value
содержит , то результат будет ."Joël est une limace"
"Joël e…"
truncatechars_html
¶
Аналогично truncatechars
, но с учетом HTML-тегов. Все теги, открытые в цепочке и не закрытые до точки усечения, сразу же закрываются после усечения.
Например :
{{ value|truncatechars_html:7 }}
Если value
содержит , то результат будет ."<p>Joël est une limace</p>"
"<p>Joël e…</p>"
Разрывы строк в содержимом HTML сохраняются.
truncatewords
¶
Обрезать строку после определенного количества слов.
Параметр: максимальное количество слов в результате
Например :
{{ value|truncatewords:2 }}
Если value
содержит , то результат будет ."Joël est une limace"
"Joël est …"
Разрывы строк внутри значения будут удалены.
truncatewords_html
¶
Аналогично truncatewords
, но с учетом HTML-тегов. Все теги, открытые в цепочке и не закрытые до точки усечения, сразу же закрываются после усечения.
Этот фильтр менее эффективен truncatewords
, поэтому его следует использовать только при работе с текстом, содержащим HTML.
Например :
{{ value|truncatewords_html:2 }}
Если value
содержит , то результат будет ."<p>Joël est une limace</p>"
"<p>Joël est …</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
равно , то результат будет ."Joël est une limace"
"JOËL EST UNE LIMACE"
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
равно , то результат будет ."Visitez www.djangoproject.com"
"Visitez <a href="http://www.djangoproject.com" rel="nofollow">www.djangoproject.com</a>"
Помимо ссылок веб-типа, urlize
также преобразует адреса электронной почты в ссылки mailto:
. Если value
содержит , то результат будет ."Envoyez les questions à [email protected]"
"Envoyez les questions à <a href="mailto:[email protected]">[email protected]</a>"
Фильтр urlize
также принимает необязательный параметр autoescape
. Если это действительно так True
, текст ссылки и URL-адреса будут экранированы фильтром escape
Django. По умолчанию autoescape
это True
.
Заметка
Если urlize
применяется к тексту, который уже содержит теги HTML, или к адресам электронной почты, содержащим одинарные кавычки ( '
), все будет работать не так, как ожидалось. Применяйте этот фильтр только к обычному тексту.
urlizetrunc
¶
Преобразует URL-адреса и адреса электронной почты в тексте в гиперссылки точно так же, как urlize , но обрезает текст из URL-адресов, длина которых превышает указанное ограничение на количество символов.
Параметр: максимальное количество символов, которое будет содержать текст ссылки после усечения, если необходимо, включая эллипс, добавленный путем усечения, если таковой имеется.
Например :
{{ value|urlizetrunc:15 }}
Если value
равно , то результат будет ."Visitez www.djangoproject.com"
'Visitez <a href="http://www.djangoproject.com" rel="nofollow">www.djangoproj…</a>'
Как и urlize , этот фильтр следует применять только к чистому тексту.
wordcount
¶
Возвращает количество слов.
Например :
{{ value|wordcount }}
Если value
равно , то результат будет ."Joël est une limace"
4
wordwrap
¶
Добавляет разрывы строк на основе максимальной длины строки.
Параметр: количество символов, после которого в тексте добавляется разрыв строки.
Например :
{{ value|wordwrap:5 }}
Если value
равно , результат будет:Joel is a slug
Joel
is a
slug
yesno
¶
Соответствует значениям true ( True
), false ( 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 ) |
Теги и фильтры интернационализации ¶
Django предоставляет теги и фильтры шаблонов для управления каждым аспектом интернационализации в шаблонах. Они позволяют более точно контролировать переводы, форматирование и преобразование часовых поясов.
i18n
¶
Эта библиотека позволяет указывать текст для перевода в шаблонах. Для того, чтобы активировать его, установить его , USE_I18N
чтобы True
затем загрузить его .{% load i18n %}
Смотрите Интернационализация: в коде шаблона .
l10n
¶
Эта библиотека используется для управления регионализацией значений в шаблонах. Достаточно загрузить библиотеку с помощью , но часто лучше также установить, чтобы регионализация была активна по умолчанию.{% load l10n %}
USE_L10N
True
См. Раздел Управление локализацией в шаблонах .
tz
¶
Эта библиотека используется для управления преобразованием часовых поясов в шаблонах. Как l10n
, просто загрузить библиотеку с ним , но это лучше также установить , чтобы таким образом , что преобразование в местное время осуществляется по умолчанию.{% load tz %}
USE_TZ
True
См. Раздел «Вывод с учетом часового пояса» в шаблонах .
Другие библиотеки тегов и фильтров ¶
Django содержит несколько других библиотек тегов шаблонов, которые необходимо явно включить в настройках INSTALLED_APPS
и которые были загружены в шаблоны вместе с тегом .{% load %}
django.contrib.humanize
¶
Набор полезных шаблонных фильтров для добавления «человечности» к данным. См. 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 }}">
Использование шаблонов Jinja2
См. Jinja2
Информацию об использовании тега static
с Jinja2.
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.