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

Этот документ описывает встроенные теги и фильтры шаблонов 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 %}

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

Выводит первую переменную аргумента, которая не является «ложной» (т.е. существует, не пуста, не является ложным логическим значением и не является нулевым числовым значением). Ничего не выдает, если все переданные переменные - «ложь».

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

{% 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 Верно, если это первый раз в цикле
forloop.last Истинно, если это последний раз в цикле
forloop.parentloop Для вложенных циклов это цикл, окружающий текущий.

forempty

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

  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в вашем контексте.

Кроме того, переменная может быть повторением имен шаблонов, и в этом случае будет использоваться первая, которая может быть загружена, в соответствии с 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Тег следует рассматривать как реализацию «делает это subtemplate и включает в себя HTML», а не как «разобрать этот subtemplate и включить его содержимое , как если бы она была частью родительского». Это означает, что между включенными шаблонами нет общего состояния - каждое включение - это полностью независимый процесс рендеринга.

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

Изменено в Django 3.1:

Добавлена ​​поддержка итераций имен шаблонов.

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» и два случайных абзаца, каждый из которых заключен в <p>теги HTML .
  • {% 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 %}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 %}citiescountrycountry_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 %}citiescountrycitiescountrycities

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

Сбрасывает предыдущий цикл, чтобы он перезапустился с первого элемента при следующем столкновении. Без аргументов сбросит последнее значение, указанное в шаблоне.{% 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.clientURLconf которого принимает идентификатор клиента (здесь 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-адресов в пространстве имен , включая использование любых подсказок, предоставляемых контекстом для текущего приложения.

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

Не забудьте 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есть , то вывод будет ."I'm using Django""I\'m using Django"

capfirst

Делает первый символ значения заглавным. Если первый символ не является буквой, этот фильтр не действует.

Например:

{{ value|capfirst }}

Если valueесть "django", то вывод будет "Django".

center

Центрирует значение в поле заданной ширины.

Например:

"{{ value|center:"15" }}"

Если valueесть "Django", то вывод будет ."     Django    "

cut

Удаляет все значения arg из данной строки.

Например:

{{ value|cut:" " }}

Если valueесть , то вывод будет ."String with spaces""Stringwithspaces"

date

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

Использует формат, аналогичный формату функции PHP date()( 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 День года. 1 к 366
Неделя    
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 цифры с ведущими нулями. '00' к '99'
Y Год, 4 цифры. '1999'
L Логическое значение високосного года. True или же False
o Год нумерации недель ISO-8601, соответствующий номеру недели 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-часовых часах, минутах и ​​«am» / «pm», с оставленными минутами, если они равны нулю, и строками для особых случаев «полночь» и «полдень», если необходимо. Собственное расширение. '1 a.m.', , , ,'1:30 p.m.''midnight''noon''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 (см. 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 }}

выходы ( спецификатор формата для локали ). И «d», и «e» экранируются обратной косой чертой, потому что в противном случае каждая из них представляет собой строку формата, которая отображает день и название часового пояса, соответственно.9 de Enero de 2008DATE_FORMATesr'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;
  • ' (одинарная кавычка) преобразуется в &#x27;
  • " (двойная кавычка) преобразуется в &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 }}

Если value123456789, вывод будет .117.7 MB

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

Строго говоря, filesizeformatэто не соответствует Международной системе единиц, которая рекомендует использовать KiB, MiB, GiB и т. Д., Когда размеры байтов вычисляются в степени 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имеет gсуффикс, он вызовет группировку по THOUSAND_SEPARATORактивной локали. Например, если активный языковой стандарт en(английский):

value Шаблон Выход
34232.34 {{ value|floatformat:"2g" }} 34,232.34
34232.06 {{ value|floatformat:"g" }} 34,232.1
34232.00 {{ value|floatformat:"-3g" }} 34,232

Использование floatformatбез аргумента эквивалентно использованию floatformat с аргументом -1.

Изменено в Django 3.1:

В более старых версиях -0для отрицательных чисел, округляемых до нуля, возвращался отрицательный ноль.

Изменено в Django 3.2:

Добавлен gсуффикс для принудительной группировки разделителями тысяч.

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

Этот фильтр можно безопасно использовать для строки, которая уже прошла через 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

Безопасно выводит объект 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>&amp;'}

<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; одна <br>новая строка становится разрывом строки HTML ( ), а новая строка, за которой следует пустая строка, становится разрывом абзаца ( </p>).

Например:

{{ value|linebreaks }}

Если valueесть , то вывод будет .Joel\nis a slug<p>Joel<br>is a slug</p>

linebreaksbr

Преобразует все символы новой строки в фрагменте обычного текста в разрывы строк HTML ( <br>).

Например:

{{ value|linebreaksbr }}

Если valueесть , то вывод будет .Joel\nis a slugJoel<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']value123['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_messages2You 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есть , то вывод будет ."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выходу. Если вы ищете что-то более надежное, вы можете использовать bleachбиблиотеку Python, особенно ее чистый метод.

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 значение, используйте 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экземпляр даты для 08:00 1 июня 2006 г., то следующее будет возвращать «8 часов»:

{{ blog_date|timesince:comment_date }}

При сравнении даты и времени с наивным смещением и с учетом смещения будет возвращена пустая строка.

Минуты - это наименьшая используемая единица, и «0 минут» будет возвращено для любой даты, которая находится в будущем относительно точки сравнения.

timeuntil

Аналогично timesince, за исключением того, что он измеряет время с настоящего момента до заданной даты или datetime. Например, если сегодня 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есть , то вывод будет ."my FIRST post""My First Post"

truncatechars

Обрезает строку, если она длиннее указанного количества символов. Усеченные строки заканчиваются переводимым многоточием («…»).

Аргумент: количество символов для усечения

Например:

{{ value|truncatechars:7 }}

Если valueесть , то вывод будет ."Joel is a slug""Joel i…"

truncatechars_html

Аналогично truncatechars, за исключением того, что он поддерживает HTML-теги. Любые теги, открытые в строке и не закрытые до точки усечения, закрываются сразу после усечения.

Например:

{{ value|truncatechars_html:7 }}

Если 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 [email protected]""Send questions to <a href="mailto:[email protected]">[email protected]</a>"

urlizeФильтр также принимает необязательный параметр autoescape. Если autoescapeесть True, текст ссылки и URL - адреса будут экранированы с помощью встроенного в Джанго 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.djangoproj…</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_L10NTrue

См. Раздел Управление локализацией в шаблонах .

tz

Эта библиотека обеспечивает управление преобразованием часовых поясов в шаблонах. Например l10n, вам нужно только загрузить библиотеку с помощью , но обычно вы также устанавливаете значение, чтобы преобразование в местное время происходило по умолчанию.{% load tz %}USE_TZTrue

См. Раздел «Вывод с учетом часового пояса» в шаблонах .

Другие библиотеки тегов и фильтров

Django поставляется с парой других библиотек шаблонных тегов, которые вы должны явно включить в своих INSTALLED_APPSнастройках и включить в своем шаблоне с помощью тега.{% load %}

django.contrib.humanize

Набор шаблонных фильтров Django, полезных для добавления «человечности» к данным. См. Django.contrib.humanize .

static

static

Ссылка на статические файлы, сохраненные в STATIC_ROOTDjango, поставляется с 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.

Copyright ©2021 All rights reserved