Spec-Zone.ru › Django 2.1

Встроенные теги и фильтры шаблонов

В данном документе описаны встроенные теги и фильтры 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 (Cross-Site Request Forgery), как описано в документации по защите от межсайтовых поддельных запросов.

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 %} не указывает 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. Не выводит ничего, если все переданные переменные False.

Пример использования:

{% firstof var1 var2 var3 %}

Это эквивалентно:

{% if var1 %}
    {{ var1 }}
{% elif var2 %}
    {{ var2 }}
{% elif var3 %}
    {{ var3 }}
{% endif %}

Вы также можете использовать литеральную строку в качестве значения по умолчанию, если все переданные переменные ложные:

{% 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 Истина, если это первая итерация цикла
forloop.last Истина, если это последняя итерация цикла
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 %}

Сложные выражения

Все вышеперечисленное может быть объединённо в сложные выражения. Для таких выражений важно знать, как группируются операторы при оценке выражения, то есть правила приоритета. Приоритет операторов, от наименьшего к наибольшему, следующий:

  • 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

{% ifequal a b %} ... {% endifequal %} является устаревшим способом записи {% if a == b %} ... {% endif %}. Аналогично, {% ifnotequal a b %} ... {% endifnotequal %} устарел и заменён на {% if a != b %} ... {% endif %}. Теги ifequal и ifnotequal будут устаревать в будущей версии.

ifchanged

Проверка, изменилось ли значение с последней итерации цикла.

Тег блока {% ifchanged %} используется внутри цикла. Он имеет два возможных применения.

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

    <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 %}
    
  2. Если заданы одна или несколько переменных, проверяет, изменилась ли какая-либо переменная. Например, следующее отображает дату каждый раз, когда она изменяется, отображая час, если изменился либо час, либо дата:

    {% 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 %}

Примечание

Тег include следует рассматривать как реализацию «отобразить этот подшаблон и включить HTML», а не как «разбирать этот подшаблон и включать его содержимое так, как будто он является частью родительского». Это означает, что между включёнными шаблонами нет общего состояния — каждое включение является полностью независимым процессом рендеринга.

Блоки оцениваются до их включения. Это означает, что шаблон, включающий блоки из другого шаблона, будет содержать блоки, которые уже были оценены и отрисованы — не блоки, которые могут быть переопределены, например, расширяющим шаблоном.

load

Загружает набор пользовательских тегов шаблона.

Например, следующий шаблон загрузит все зарегистрированные теги и фильтры в somelibrary и otherlibrary, расположенные в пакете package:

{% load somelibrary package.otherlibrary %}

Вы также можете выборочно загружать отдельные фильтры или теги из библиотеки, используя аргумент from. В этом примере будут загружены теги/фильтры с именами foo и bar из somelibrary:

{% load foo bar from somelibrary %}

См. Библиотеки пользовательских тегов и фильтров для получения дополнительной информации.

lorem

Отображает случайный текст «лорем ипсум» на латыни. Это полезно для предоставления тестовых данных в шаблонах.

Использование:

{% lorem [count] [method] [random] %}

Тег {% lorem %} может использоваться с нулем, одной, двумя или тремя аргументами. Аргументы:

Аргумент Описание
count Число (или переменная), содержащая количество абзацев или слов для генерации (по умолчанию 1).
method w для слов, p для HTML абзацев или b для абзацев простого текста (по умолчанию b).
random Слово random, которое, если задано, не использует общий абзац («Lorem ipsum dolor sit amet…») при генерации текста.

Примеры:

  • {% lorem %} выведет общий абзац «лорем ипсум».
  • {% lorem 3 p %} выведет общий абзац «лорем ипсум» и два случайных абзаца, каждый заключенный в теги 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) из объектов групп. Объекты групп — это экземпляры namedtuple() с двумя полями:

  • grouper – элемент, по которому производилась группировка (например, строка «Индия» или «Япония»).
  • list – список всех элементов в этой группе (например, список всех городов с country=’Индия’).

Поскольку {% 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 не сортирует своих членов по 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 вместо ключей.

resetcycle

Сбрасывает предыдущий тег cycle, чтобы он начинался с первого элемента при следующем использовании. Без аргументов {% 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".

Вы также можете сбросить теги циклов с именами:

{% 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 %}

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

Например, предположим, что у вас есть представление app_views.client, для которого URLconf принимает идентификатор клиента (здесь client() — метод внутри файла представлений app_views.py). Строка URLconf может выглядеть так:

path('client/<int:id>/', app_views.client, name='app-views-client')

Если URLconf этой приложения включён в URLconf проекта по пути, например, такому:

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 с именованным пространством, включая использование любых подсказок, предоставленных контекстом относительно текущего приложения.

Предупреждение

Не забудьте поставить кавычки вокруг имени 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

Форматирует дату в соответствии с заданным форматом.

Использует формат, похожий на функцию date() PHP (https://php.net/date), с некоторыми отличиями.

Примечание

Эти символы формата не используются в Django вне шаблонов. Они были разработаны для совместимости с PHP, чтобы облегчить переход для дизайнеров.

Доступные строки формата:

Символ формата Описание Пример вывода
День
d День месяца, 2 цифры с ведущими нулями. '01' до '31'
j День месяца без ведущих нулей. '1' до '31'
D День недели, текстовое представление, 3 буквы. 'Fri'
l День недели, текстовое представление, полное. 'Friday'
S Английский порядковый суффикс для дня месяца, 2 символа. 'st', 'nd', 'rd' или 'th'
w День недели, цифры без ведущих нулей. '0' (воскресенье) до '6' (суббота)
z День года. 0 до 365
Неделя
W Номер недели года по ISO-8601, недели начинаются с понедельника. 1, 53
Месяц
m Месяц, 2 цифры с ведущими нулями. '01' до '12'
n Месяц без ведущих нулей. '1' до '12'
M Месяц, текстовое представление, 3 буквы. 'Jan'
b Месяц, текстовое представление, 3 буквы, строчные. 'jan'
E Месяц, альтернативное представление, специфичное для локали, обычно используется для представления длинных дат. 'listopada' (для польской локали, в отличие от 'Listopad')
F Месяц, текстовое представление, полное. 'January'
N Сокращение месяца в стиле Associated Press. Собственная расширение. 'Jan.', 'Feb.', 'March', 'May'
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-часовых часах и минутах, без минут, если они нулевые. Собственная расширение. '1', '1:30'
P Время в 12-часовых часах, минутах и «a.m.»/«p.m.», без минут, если они нулевые, и специальные строки «полночь» и «полдень», если это уместно. Собственная расширение. '1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
Часовой пояс
e Имя часового пояса. Может быть в любом формате или может вернуть пустую строку, в зависимости от datetime. '', '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 если datetime наивна
r RFC 5322 отформатированная дата. 'Thu, 21 Dec 2000 16:01:07 +0200'
U Секунды с эпохи Unix (1 января 1970 г. 00:00:00 UTC).

Например:

{{ 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 с фильтром 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-строку. В частности, он выполняет эти замены:

  • < преобразуется в &lt;
  • > преобразуется в &gt;
  • ' (одинарная кавычка) преобразуется в &#39;
  • " (двойная кавычка) преобразуется в &quot;
  • & преобразуется в &amp;

Применение 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 KB', '4.1 MB', '102 bytes', и т. д.).

Например:

{{ value|filesizeformat }}

Если value равно 123456789, вывод будет 117.7 MB.

Размеры файлов и единицы СИ

Строго говоря, filesizeformat не соответствует Международной системе единиц, которая рекомендует использовать КиБ, МиБ, ГиБ и т. д., когда размеры байтов рассчитываются в степенях 1024 (что имеет место здесь). Вместо этого Django использует традиционные единицы измерения (КБ, МБ, ГБ и т. д.), соответствующие более распространённым названиям.

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&amp;me=2".

join

Объединяет список со строкой, как в Python str.join(list)

Например:

{{ value|join:" // " }}

Если value является списком ['a', 'b', 'c'], вывод будет строкой "a // b // c".

json_script

Новое в Django 2.1.

Безопасно выводит объект 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 следующим образом:

var value = JSON.parse(document.getElementById('hello-data').textContent);

Атаки XSS смягчены путём экранирования символов «<», «>» и «&». Например, если value равно {'hello': 'world</script>&amp;'}, вывод —:

<script id="hello-data" type="application/json">{"hello": "world\\u003C/script\\u003E\\u0026amp;"}</script>

Это совместимо с жёсткой политикой Content Security Policy, которая запрещает выполнение скриптов на странице. Она также поддерживает чистое разделение пассивных данных и исполняемого кода.

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. См. 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 равно "Joel is a slug", вывод будет "joel-is-a-slug".

stringformat

Форматирует переменную в соответствии с аргументом, строковым спецификатором форматирования. Этот спецификатор использует синтаксис форматирования строк в стиле printf, за исключением того, что ведущий «%» опускается.

Например:

{{ value|stringformat:"E" }}

Если value равно 10, вывод будет 1.000000E+01.

striptags

Предпринимает все возможные усилия для удаления всех тегов [X]HTML.

Например:

{{ 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" (спецификатор формата de для региона "TIME_FORMAT", как поставляется с Django, составляет "H:i").

Фильтр time будет принимать параметры в строке формата, относящиеся только к времени суток, а не к дате (по очевидным причинам). Если вам нужно отформатировать значение date, используйте фильтр 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 — экземпляр даты для 8: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 равно "my FIRST post", то результатом будет "My First Post".

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

Международные теги и фильтры

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 шаблонов, полезных для добавления «человеческого» подхода к данным. См. 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.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/2.1/ref/templates/builtins/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API