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

В этом документе описаны встроенные теги и фильтры шаблонов в Django. Рекомендуется использовать автоматическую документацию , если таковая имеется, поскольку она также будет включать документацию для любых потенциально установленных пользовательских фильтров или тегов.

Справочник по встроенным тегам

autoescape

Управляет текущим поведением автоматического выхода. Этот тег принимает on или off в качестве параметра, и он определяет, активен ли автоматический экранирование в соответствующем блоке. Блок должен быть закрыт закрывающим тегом endautoescape .

Когда активно автоматическое экранирование, все содержимое переменных подвергается экранированию HTML перед отображением (но после применения любых фильтров). Это эквивалентно применению фильтра escape к каждой переменной вручную .

Единственными исключениями являются переменные, которые уже помечены как «безопасные» (больше не нужно экранировать) либо кодом, который определил рассматриваемую переменную, либо потому, что она уже была отфильтрована, safe либо escape .

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

{% autoescape on %}
    {{ body }}
{% endautoescape %}

block

Определяет блок, который может быть перегружен дочерними шаблонами. Для получения дополнительной информации см. Наследование шаблонов .

comment

Игнорируйте все, что находится между и . В первый тег можно вставить необязательное примечание. Например, это может быть полезно для объяснения причин закомментированного фрагмента кода.{% comment %} {% endcomment %}

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

<p>Rendered text with {{ pub_date|date:"c" }}</p>
{% comment "Optional note" %}
    <p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}

Теги comment не могут быть вложенными.

csrf_token

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

cycle

Отображает один из своих параметров каждый раз, когда появляется тег. Первый параметр отображается при первом появлении, второй параметр - при втором и так далее. После использования всех параметров тег начинается с первого параметра и снова отображает его.

Этот тег особенно полезен в цикле:

{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}

Первая итерация создает HTML-код, относящийся к классу row1 , вторая - к row2 , третья - обратно row1 и так далее для каждой итерации цикла.

Вы также можете использовать переменные. Например, если у вас есть две переменные шаблона rowvalue1 и rowvalue2 , вы можете чередовать их значения следующим образом:

{% for o in some_list %}
    <tr class="{% cycle rowvalue1 rowvalue2 %}">
        ...
    </tr>
{% endfor %}

Переменные, включенные в цикл, будут экранированы. Вы можете отключить автоматическое экранирование с помощью:

{% for o in some_list %}
    <tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}">
        ...
    </tr>
{% endfor %}

Вы можете смешивать переменные и строки:

{% for o in some_list %}
    <tr class="{% cycle 'row1' rowvalue2 'row3' %}">
        ...
    </tr>
{% endfor %}

В некоторых случаях может быть желательно обратиться к текущему значению цикла без перехода к следующему значению. Для этого дайте тегу имя через "as", например:{% cycle %}

{% cycle 'row1' 'row2' as rowcolors %}

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

<tr>
    <td class="{% cycle 'row1' 'row2' as rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>
<tr>
    <td class="{% cycle rowcolors %}">...</td>
    <td class="{{ rowcolors }}">...</td>
</tr>

отобразит:

<tr>
    <td class="row1">...</td>
    <td class="row1">...</td>
</tr>
<tr>
    <td class="row2">...</td>
    <td class="row2">...</td>
</tr>

Вы можете использовать любое количество значений в теге cycle , разделенных пробелами. Значения, заключенные в одинарные ( ' ) или двойные ( " ) кавычки, обрабатываются как буквальные строки, тогда как значения без кавычек рассматриваются как переменные шаблона.

По умолчанию, при использовании ключевого слова as с тегом cycle , использование того, кто запускает цикл, само по себе дает первое значение в цикле. Это может быть проблемой, если вы хотите использовать значение во вложенном цикле или включенном шаблоне. Если вы хотите только объявить цикл, но без получения первого значения, вы можете добавить ключевое слово в качестве последнего ключевого слова тега. Например :{% cycle %} silent

{% for obj in some_list %}
    {% cycle 'row1' 'row2' as rowcolors silent %}
    <tr class="{{ rowcolors }}">{% include "subtemplate.html" %}</tr>
{% endfor %}

Будет отображен список элементов <tr> с class чередованием атрибута между row1 и row2 . Подшаблон будет иметь доступ rowcolors в своем контексте, и его значение будет соответствовать значению окружающего class тега <tr> . Если нам не удалось добавить ключевое слово silent , row1 и row2 была бы отображаться в виде обычного текста, вне элемента <tr> .

Когда ключевое слово silent используется в определении цикла, это автоматически применяется ко всем последующим использованиям этого cycle конкретного тега . В следующем шаблоне ничего не отображается , даже если второй вызов не указывает :{% cycle %} silent

{% cycle 'row1' 'row2' as rowcolors silent %}
{% cycle rowcolors %}

Можно использовать тег resetcycle для сброса тега к его первому значению в следующий раз, когда он появится.{% cycle %}

debug

Отображает множество отладочной информации, включая текущий контекст и импортированные модули.

extends

Указывает, что этот шаблон расширяет родительский шаблон.

Этот тег можно использовать двумя способами:

  • {% extends "base.html" %} (в кавычках) использует буквальное значение "base.html" в качестве имени расширяемого родительского шаблона.
  • {% extends variable %} использует значение variable . Если переменная содержит строку, Django использует эту строку как имя родительского шаблона. Если переменная содержит объект Template , Django использует этот объект в качестве родительского шаблона.

Для получения дополнительной информации см. Наследование шаблонов .

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

dir1/
    template.html
    base2.html
    my/
        base3.html
base1.html

В template.html , допустимы следующие пути:

{% extends "./base2.html" %}
{% extends "../base1.html" %}
{% extends "./my/base3.html" %}

filter

Фильтрует содержимое блока с помощью одного или нескольких фильтров. Несколько фильтров должны быть разделены вертикальной чертой, и фильтры могут иметь параметры, как и в синтаксисе переменных.

Обратите внимание , что блок включает в себя весь текст между filter и тегами endfilter .

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

{% filter force_escape|lower %}
    This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}

Заметка

Фильтры escape и safe параметры недопустимы. Вы по-прежнему можете использовать тег autoescape для обработки автоматического экранирования в блоках кода шаблона.

firstof

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

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

{% firstof var1 var2 var3 %}

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

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

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

{% firstof var1 var2 var3 "fallback value" %}

Этот тег автоматически экранирует значения переменных. Вы можете отключить автоматическое экранирование с помощью:

{% autoescape off %}
    {% firstof var1 var2 var3 "<strong>fallback value</strong>" %}
{% endautoescape %}

Или, если нужно экранировать только определенные переменные, вы можете использовать:

{% firstof var1 var2|safe var3 "<strong>fallback value</strong>"|safe %}

Вы можете использовать синтаксис для сохранения результата в переменной.{% firstof var1 var2 var3 as value %}

for

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

<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

Вы можете перевернуть список, используя {% for obj in list reversed%} `.

Если вам нужно пройтись по списку списков, вы можете выделить значения каждого подсписка в отдельные переменные. Например, если ваш контекст содержит список координат (x, y), который называется points , вот как вы можете отобразить список точек:

{% for x, y in points %}
    There is a point at {{ x }},{{ y }}
{% endfor %}

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

{% for key, value in data.items %}
    {{ key }}: {{ value }}
{% endfor %}

Помните, что для оператора точки поиск ключа словаря имеет приоритет перед поиском метода. Так, если в словаре data содержится ключ с именем 'items' , data.items возвращает data['items'] вместо data.items() . Избегайте добавления ключей, которые имеют то же имя, что и методы словаря, если вы хотите использовать эти методы в шаблонах ( items , values и keys т. Д.). Более подробную информацию о порядке поиска для оператора точки можно найти в документации переменных шаблона .

Цикл for определяет ряд переменных, доступных внутри цикла:

переменная Описание
forloop.counter Текущая итерация цикла (индекс начинается с 1)
forloop.counter0 Текущая итерация цикла (индекс от 0)
forloop.revcounter Количество итераций от конца цикла (индекс с 1)
forloop.revcounter0 Количество итераций от конца цикла (индекс от 0)
forloop.first True если цикл находится на первой итерации
forloop.last True если цикл находится на последней итерации
forloop.parentloop Для вложенных циклов это цикл верхнего уровня.

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

Тег оценивает переменную, и если переменная имеет значение (то есть существует, не пуста и не содержит логического значения false), отображается содержимое блока:{% if %} True

{% if athlete_list %}
    Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
    Athletes should be out of the locker room soon!
{% else %}
    No athletes.
{% endif %}

В приведенном выше примере, если athlete_list не пусто, количество спортсменов отображается переменной .{{ athlete_list|length }}

Как видите, тег if принимает одно или несколько предложений или предложение , содержимое которого отображается, если все предыдущие условия не выполнены. Эти пункты необязательны.{% elif %} {% else %}

Булевы операторы

Теги if могут использовать and (и), or (или) или not (not) для проверки ряда переменных или для инвертирования значения данной переменной:

{% if athlete_list and coach_list %}
    Both athletes and coaches are available.
{% endif %}

{% if not athlete_list %}
    There are no athletes.
{% endif %}

{% if athlete_list or coach_list %}
    There are some athletes or some coaches.
{% endif %}

{% if not athlete_list or coach_list %}
    There are no athletes or there are some coaches.
{% endif %}

{% if athlete_list and not coach_list %}
    There are some athletes and absolutely no coaches.
{% endif %}

Допускается использование обоих and и or в одном теге с учетом того, что and имеет более высокий приоритет, чем or . Например :

{% if athlete_list and coach_list or cheerleader_list %}

будет интерпретироваться как:

if (athlete_list and coach_list) or cheerleader_list

Использование круглых скобок в теге if является синтаксической ошибкой. Если вам нужно изменить приоритет оператора, вам нужно пройти через if вложенные теги .

Теги if могут также использовать операторы == , != , < , > , <= , >= , in (в) , и эту функцию следующим образом :not in is is not

Оператор ==

Равенство. Пример:

{% if somevar == "x" %}
  This appears if variable somevar equals the string "x"
{% endif %}
Оператор !=

Неравенство. Пример:

{% if somevar != "x" %}
  This appears if variable somevar does not equal the string "x",
  or if somevar is not found in the context
{% endif %}
Оператор <

Меньше, чем. Пример:

{% if somevar < 100 %}
  This appears if variable somevar is less than 100.
{% endif %}
Оператор >

Лучше чем. Пример:

{% if somevar > 0 %}
  This appears if variable somevar is greater than 0.
{% endif %}
Оператор <=

Меньше или равно. Пример:

{% if somevar <= 100 %}
  This appears if variable somevar is less than 100 or equal to 100.
{% endif %}
Оператор >=

Больше или равно. Пример:

{% if somevar >= 1 %}
  This appears if variable somevar is greater than 1 or equal to 1.
{% endif %}
Оператор in

Содержалась в. Этот оператор поддерживается многими контейнерами Python для проверки того, находится ли данное значение в контейнере. В следующем коде показаны некоторые примеры интерпретации :x in y

{% if "bc" in "abcdef" %}
  This appears since "bc" is a substring of "abcdef"
{% endif %}

{% if "hello" in greetings %}
  If greetings is a list or set, one element of which is the string
  "hello", this will appear.
{% endif %}

{% if user in users %}
  If users is a QuerySet, this will appear if user is an
  instance that belongs to the QuerySet.
{% endif %}
Оператор not in

Не содержится в. Это отрицание оператора in .

Оператор is

Идентичность объекта. Проверяет, являются ли два значения одним и тем же объектом. Пример:

{% if somevar is True %}
  This appears if and only if somevar is True.
{% endif %}

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
Оператор is not

Отрицание идентичности объекта. Проверяет, не являются ли два значения одним и тем же объектом. Это отрицание оператора is . Пример:

{% if somevar is not True %}
  This appears if somevar is not True, or if somevar is not found in the
  context.
{% endif %}

{% if somevar is not None %}
  This appears if and only if somevar is not None.
{% endif %}

Фильтры

Вы также можете использовать фильтры в выражении if . Например :

{% if messages|length >= 100 %}
   You have lots of messages today!
{% endif %}

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

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

  • or
  • and
  • not
  • in
  • == , != , < , > , <= ,>=

(Это в точности соответствует поведению Python). Так, например, if следующий сложный тег :

{% if a == b or c == d and e %}

… Будет интерпретироваться как:

(a == b) or ((c == d) and e)

Если вам нужно изменить приоритет, вам нужно будет вложить теги if . Иногда он более читабелен, особенно для тех, кто не очень понимает правила приоритета.

Операторы сравнения не могут быть связаны в цепочку, как в Python или математической нотации. Например, вместо написания:

{% if a > b > c %}  (WRONG)

вы должны написать:

{% if a > b and b > c %}

ifequal и ifnotequal

Не рекомендуется, начиная с версии 3.1.

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

ifchanged

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

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

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

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

Изменено в 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», а также два случайных абзаца, все вставленные в теги HTML <p> .
  • {% lorem 2 w random %} производит два случайных латинских слова.

now

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

Пример:

It is {% now "jS F Y H:i" %}

Обратите внимание, что вы можете использовать обратную косую черту для строки формата, если хотите использовать «сырое» значение. В этом примере «f» и «o» экранируются обратной косой чертой, в противном случае каждая из них будет интерпретироваться как строка формата для отображения года и времени соответственно:

It is the {% now "jS \o\f F" %}

Отображаемый результат: «4 сентября».

Заметка

Указанный формат также может соответствовать одному из заранее определенных форматов DATE_FORMAT , DATETIME_FORMAT , SHORT_DATE_FORMAT или SHORT_DATETIME_FORMAT . Предопределенные форматы могут различаться в зависимости от активного языка и активации локализации формата , например. :

It is {% now "SHORT_DATETIME_FORMAT" %}

Вы также можете использовать синтаксис для сохранения вывода (в виде строки) внутри переменной. Это полезно, если вы хотите использовать внутри тега шаблона, например:{% now "Y" as current_year %} {% now %} blocktranslate

{% now "Y" as current_year %}
{% blocktranslate %}Copyright {{ current_year }}{% endblocktranslate %}

regroup

Группирует список похожих объектов по общему атрибуту.

Лучший способ проиллюстрировать этот сложный тег - привести пример: скажем, он cities содержит список городов, представленных словарями, содержащими ключи "name" , "population" и "country" :

cities = [
    {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
    {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
    {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
    {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
    {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]

... и вы хотите отобразить иерархический список, отсортированный по странам, например:

  • Индия
    • Мумбаи: 19,000,000
    • Калькутта: 15 000 000
  • Соединенные Штаты Америки
    • Нью-Йорк: 20,000,000
    • Чикаго: 7,000,000
  • Япония
    • Токио: 33000000

Вы можете использовать тег для группировки списка городов по странам. Это делает следующий фрагмент кода шаблона:{% regroup %}

{% regroup cities by country as country_list %}

<ul>
{% for country in country_list %}
    <li>{{ country.grouper }}
    <ul>
        {% for city in country.list %}
          <li>{{ city.name }}: {{ city.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

Давайте рассмотрим этот пример. принимает три параметра: список, который вы хотите сгруппировать, атрибут, по которому нужно сгруппировать, и имя результирующего списка. В этом случае мы группируем список по атрибутам и называем результат .{% regroup %} cities country country_list

{% regroup %} создает список (в данном случае country_list ) групповых объектов . Объекты группы - это экземпляры, namedtuple() содержащие два поля:

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

В качестве продукта объектов предыдущий пример также можно записать следующим образом:{% regroup %} namedtuple()

{% regroup cities by country as country_list %}

<ul>
{% for country, local_cities in country_list %}
    <li>{{ country }}
    <ul>
        {% for city in local_cities %}
          <li>{{ city.name }}: {{ city.population }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>

Обратите внимание, что не сортирует то, что он получает! Наш пример основан на том, что список сначала сортируется по . Если бы список не был отсортирован по странам, группировка наивно отображала бы более одной группы на страну. Например, если список содержал это (обратите внимание, что страны не сгруппированы):{% regroup %} cities country cities cities

cities = [
    {'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
    {'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
    {'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
    {'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
    {'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]

С этим содержимым cities приведенный выше пример кода шаблона даст следующий результат:{% regroup %}

  • Индия
    • Мумбаи: 19,000,000
  • Соединенные Штаты Америки
    • Нью-Йорк: 20,000,000
  • Индия
    • Калькутта: 15 000 000
  • Соединенные Штаты Америки
    • Чикаго: 7,000,000
  • Япония
    • Токио: 33000000

Самое простое решение этой проблемы - убедиться на уровне представления, что данные отсортированы по любым критериям, которые вы хотите использовать для отображения.

Другое решение - отсортировать данные в шаблоне с помощью фильтра dictsort , если данные состоят из списка словарей:

{% regroup cities|dictsort:"country" by country as country_list %}

Группировка по другим свойствам

Любой поиск по атрибутам, принятый в шаблонах, может использоваться как атрибут группировки для тега regroup , включая методы, атрибуты, ключи словаря и элементы списка. Например, если поле «страна» является внешним ключом для класса с атрибутом «описание», вы можете написать:

{% regroup cities by country.description as country_list %}

Или, если country это поле, содержащее choices ( choices ), у него будет метод, get_FOO_display() доступный в качестве атрибута, позволяющий группировать по видимой строке, а не по выбранному ключу:

{% regroup cities by get_country_display as country_list %}

{{ country.grouper }} теперь содержит часть значений вариантов, choices а не их ключ.

resetcycle

Сбрасывает предыдущий цикл, чтобы он начинался с первого элемента при следующем вхождении. Без параметров повторно инициализирует последнее, определенное в шаблоне.{% resetcycle %} {% cycle %}

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

{% for coach in coach_list %}
    <h1>{{ coach.name }}</h1>
    {% for athlete in coach.athlete_set.all %}
        <p class="{% cycle 'odd' 'even' %}">{{ athlete.name }}</p>
    {% endfor %}
    {% resetcycle %}
{% endfor %}

В этом примере создается следующий HTML-код:

<h1>José Mourinho</h1>
<p class="odd">Thibaut Courtois</p>
<p class="even">John Terry</p>
<p class="odd">Eden Hazard</p>

<h1>Carlo Ancelotti</h1>
<p class="odd">Manuel Neuer</p>
<p class="even">Thomas Müller</p>

Обратите внимание, как заканчивается первый блок class="odd" и начинается новый блок class="odd" . Без тега второй блок начался бы с .{% resetcycle %} class="even"

Также можно сбросить cycle именованные теги :

{% for item in list %}
    <p class="{% cycle 'odd' 'even' as stripe %} {% cycle 'major' 'minor' 'minor' 'minor' 'minor' as tick %}">
        {{ item.data }}
    </p>
    {% ifchanged item.category %}
        <h1>{{ item.category }}</h1>
        {% if not forloop.first %}{% resetcycle tick %}{% endif %}
    {% endifchanged %}
{% endfor %}

В этом примере у нас есть как чередующиеся четные / нечетные строки, так и «основная» строка через каждые пять строк. При изменении категории сбрасывается только цикл пяти строк.

spaceless

Удаляет пробелы между тегами HTML. Символы табуляции и разрывы строк также считаются пробелами.

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

{% spaceless %}
    <p>
        <a href="foo/">Foo</a>
    </p>
{% endspaceless %}

В этом примере создается следующий HTML-код:

<p><a href="foo/">Foo</a></p>

Удаляются только пробелы между тегами , а не между тегами и текстом. В этом примере пробелы вокруг Hello не будут удалены:

{% spaceless %}
    <strong>
        Hello
    </strong>
{% endspaceless %}

templatetag

Отображает одну из последовательностей символов, используемых в синтаксисе тега шаблона.

Поскольку в системе шаблонов нет концепции «экранирования», если вы хотите отобразить части синтаксиса, используемые в тегах шаблона, вы должны использовать этот тег .{% templatetag %}

Параметр указывает, какую последовательность шаблонов вы хотите отобразить:

настройка плакат
openblock {%
closeblock %}
openvariable {{
closevariable }}
openbrace {
closebrace }
opencomment {#
closecomment #}

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

{% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}

url

Возвращает ссылку на абсолютный путь (URL без имени домена), соответствующий представлению и необязательным параметрам. Любой специальный символ в полученном пути будет закодирован с помощью iri_to_uri() .

Это способ отображения ссылок, не нарушая принципа DRY («не повторяйтесь»), избегая замораживания URL-адресов в шаблонах:

{% url 'some-url-name' v1 v2 %}

Первый параметр - это имя шаблона URL . Это может быть буквальная строка в кавычках или контекстная переменная. Дополнительные параметры являются необязательными и предоставляются в виде значений, разделенных пробелами, которые будут использоваться в качестве параметров URL-адреса. В приведенном выше примере показано, как передавать позиционные параметры. Также можно использовать синтаксис ключевых слов

{% url 'some-url-name' arg1=v1 arg2=v2 %}

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

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

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

Если конфигурация URL-адреса этого приложения включена в конфигурацию URL-адреса проекта по следующему пути:

path('clients/', include('project_name.app_name.urls'))

... затем вы можете в шаблоне создать ссылку на это представление следующим образом:

{% url 'app-views-client' client.id %}

Тег шаблона отобразит текст /clients/client/123/ .

Обратите внимание: если URL-адрес, который вы разрешаете, не существует, вы получите исключение NoReverseMatch , которое приведет к отображению страницы с ошибкой на вашем сайте.

Если вы хотите получить URL-адрес, не отображая его, вы можете сделать несколько другой вызов:

{% url 'some-url-name' arg arg2 as the_url %}

<a href="{{ the_url }}">I'm linking to {{ the_url }}</a>

Область видимости переменной, созданной синтаксисом, - это область, в которой появляется тег .as var {% block %} {% url %}

Этот синтаксис не приведет к ошибке, если представление отсутствует. На практике вы будете использовать это для ссылок на необязательные представления:{% url ... as var %}

{% url 'some-url-name' as the_url %}
{% if the_url %}
  <a href="{{ the_url }}">Link to optional stuff</a>
{% endif %}

Если вы хотите получить URL-адрес с пространством имен, укажите полное имя:

{% url 'myapp:view-name' %}

Обычная стратегия разрешения URL с пространством имен будет следовать, в том числе использования флагов , предусмотренного контекст в качестве текущего приложения.

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

Не забудьте name заключить шаблон URL в кавычки, иначе значение будет интерпретировано как переменная контекста!

verbatim

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

Это часто используется для включения уровня шаблона JavaScript, который конфликтует с синтаксисом Django. Например :

{% verbatim %}
    {{if dying}}Still alive.{{/if}}
{% endverbatim %}

Вы также можете назначить специальный закрывающий тег, позволяющий использовать его как часть необработанного содержимого:{% endverbatim %}

{% verbatim myblock %}
    Avoid template rendering via the {% verbatim %}{% endverbatim %} block.
{% endverbatim myblock %}

widthratio

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

Например :

<img src="bar.png" alt="Bar"
     height="10" width="{% widthratio this_value max_value max_width %}">

Если this_value это 175, max_value 200 и max_width 100, ширина изображения в приведенном выше примере будет 88 пикселей (потому что 175/200 = 0,875; 0,875 * 100 = 87,5, что округляется до 88).

В некоторых случаях вы можете захотеть зафиксировать результат widthratio в переменной. Это может быть полезно, например, в blocktranslate таких случаях:

{% widthratio this_value max_value max_width as width %}
{% blocktranslate %}The width is: {{ width }}{% endblocktranslate %}

with

Помещает результат сложного выражения под более простое имя. Это полезно при множественном доступе к дорогостоящему методу (например, с доступом к базе данных).

Например :

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

Создана переменная (в приведенном выше примере, total ) доступен только между и тегов .{% with %} {% endwith %}

Вы можете создать более одной переменной контекста:

{% with alpha=1 beta=2 %}
    ...
{% endwith %}

Заметка

По-прежнему поддерживается более старый, более подробный формат: {% with business.employees.count as total %}

Справочник по встроенным фильтрам

add

Добавляет параметр к значению.

Например :

{{ value|add:"2" }}

Если value равно 4 , то результат будет 6 .

Этот фильтр сначала пытается заставить два значения быть целыми числами. Если это не удается, он все равно пытается сложить два значения. Он работает с одними типами данных (строки, списки и т. Д.) И не работает с другими. Если вторая попытка не удалась, результатом будет пустая строка.

Например, если у нас есть:

{{ first|add:second }}

а то first есть и стоит , результат будет .[1, 2, 3] second [4, 5, 6] [1, 2, 3, 4, 5, 6]

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

Строки, которые можно преобразовать в целые числа, будут складываться, а не объединяться, как в первом примере выше.

addslashes

Добавляет обратную косую черту перед кавычками. Полезно, например, для экранирования строк в CSV.

Например :

{{ value|addslashes }}

Если value содержит , то результат будет ."J'utilise Django" "J\'utilise Django"

capfirst

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

Например :

{{ value|capfirst }}

Если value содержит "django" , то результат будет "Django" .

center

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

Например :

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

Если value содержит "Django" , то результат будет ."     Django    "

cut

Удаляет все значения параметров из строки для фильтрации.

Например :

{{ value|cut:" " }}

Если value содержит , то результат будет ."Chaîne avec des espaces" "Chaîneavecdesespaces"

date

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

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

Заметка

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

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

Форматировать символ Описание Пример дисплея
День    
d День месяца, 2 цифры, при необходимости дополненные нулем. '01' в '31'
j День месяца без ведущих нулей. '1' в '31'
D День недели, трехзначное сокращение. 'ven'
l День недели, полный текст. 'vendredi'
S Английский порядковый суффикс дня месяца, состоящий из 2 знаков. 'st' , 'nd' , 'rd' Или'th'
w День недели, число без нуля в начале. '0' (Воскресенье) - '6' (суббота)
z День года. 1 в 366
Неделя    
W Номер недели в году согласно ISO-8601, недели, начинающиеся с понедельника. 1 , 53
Месяц    
m Месяц, 2 цифры, при необходимости с нуля в начале. '01' в '12'
n Месяц (цифры) без нуля в начале. '1' в '12'
M Месяц, трехзначное сокращение. 'jan'
b Месяц, трехзначное сокращение в нижнем регистре. 'jan'
E Месяц, альтернативное представление, специфичное для активного языка, обычно используется для дат в расширенном формате. 'listopada' (для польского, в отличие от 'Listopad' )
F Месяц в длинном текстовом формате. 'janvier'
N Аббревиатура месяца в стиле Associated Press. Расширение владельца. 'jan.' , 'fév.' , 'mars' ,'mai'
t Количество дней в указанном месяце. 28 в 31
Год    
y Год на 2-х цифрах. '99'
Y Год в 4-значном формате. '1999'
L Логическое значение, указывающее, является ли этот год високосным. True или False
o Год согласно ISO-8601 (W), подсчет недель с использованием високосной недели. См. Y для более обычного формата года. '1999'
Час    
g Часовой 12-часовой формат без ведущих нулей. '1' в '12'
G Часовой, 24-часовой формат без ведущих нулей. '0' в '23'
h Время в 12-часовом формате. '01' в '12'
H Время в 24-часовом формате. '00' в '23'
i Протокол. '00' в '59'
s Секунды, 2 цифры с нулем в начале. '00' в '59'
u Микросекунды. 000000 в 999999
a 'a.m.' или 'p.m.' (обратите внимание, что это немного отличается от отображения PHP наличием точек, соответствующих стилю Associated Press). 'a.m.'
A 'AM' или 'PM' . 'AM'
f Час в формате часов и минут более 12 часов, без отображения минут, если они равны 0. Собственное расширение. '1' , '1:30'
P Час в 12-часовом формате, минуте и формате «am» / «pm», без минут, если они равны 0; где возможно, появляются каналы «полночь» и «полдень». Расширение владельца. '1 a.m.' , , , ,'1:30 p.m.' 'minuit' 'midi' '12:30 p.m.'
Часовой пояс    
e Название часового пояса. В зависимости от даты / времени могут отображаться разные форматы или даже пустая строка. '' , 'GMT' , '-500' , 'US/Eastern' , И т.д.
I Летнее время, указание, активно оно или нет. '1' или '0'
O Разница в часах со средним временем по Гринвичу. '+0200'
T Часовой пояс машины. 'EST' , 'MDT'
Z Смещение часового пояса в секундах. Смещение для часовых поясов к западу от UTC всегда отрицательно, а для часовых поясов к востоку от UTC - положительно. -43200 в 43200
Дата час    
c Формат ISO 8601 (примечание: в отличие от других форматов, таких как «Z», «O» или «r», формат «c» не добавляет смещение часового пояса, если значение является наивной датой / временем (см. datetime.tzinfo ). 2008-01-02T10:30:00.000123+02:00 или 2008-01-02T10:30:00.000123 если дата / время наивны
r Дата отформатирована в соответствии с RFC 5322 . 'ven, 22 Nov 2013 18:41:16 +0100'
U Секунды с момента начального времени Unix (1 января 1970 г., 00:00:00 UTC).  

Например :

{{ value|date:"D d M Y" }}

Если value объект datetime (например, результат datetime.datetime.now() ), результатом будет текст .'mer 09 jan 2008'

Указанный формат может соответствовать одному из заранее определенных форматов DATE_FORMAT , DATETIME_FORMAT , SHORT_DATE_FORMAT или SHORT_DATETIME_FORMAT , или используя пользовательский формат спецификаторов формата , описанных в таблице выше. Обратите внимание, что предопределенные форматы могут различаться в зависимости от активного языка.

Например , в случае где USE_L10N есть True и то LANGUAGE_CODE есть "es" для:

{{ value|date:"SHORT_DATE_FORMAT" }}

результатом будет текст "09/01/2008" (формат "SHORT_DATE_FORMAT" локали , es поставляемый с Django, есть "d/m/Y" ).

Если строка формата не указана, используется формат DATE_FORMAT . С настройками, аналогичными предыдущему примеру:

{{ value|date }}

Продукт ( локаль формат является ). «D» и «e» экранируются обратной косой чертой, потому что в противном случае они считались бы маркерами формата, показывающими день и имя часового пояса соответственно.9 de Enero de 2008 DATE_FORMAT es r'j \d\e F \d\e Y'

Вы можете комбинировать date с фильтром, time чтобы получить полное представление значения datetime , например. :

{{ value|date:"D d M Y" }} {{ value|time:"H:i" }}

default

Если value оценивается в False , default отображается параметр. В противном случае value отображается значение .

Например :

{{ value|default:"nothing" }}

Если value содержит "" (пустую строку), результат будет nothing .

default_if_none

Если (и только если) value верно None , default отображается параметр. В противном случае value отображается значение .

Обратите внимание: если передана пустая строка, значение по умолчанию использоваться не будет . Используйте фильтр, default если вы хотите, чтобы значение по умолчанию также использовалось для пустых строк.

Например :

{{ value|default_if_none:"nothing" }}

Если value равно None , то результат будет nothing .

dictsort

Принимает список словарей и возвращает этот список, отсортированный по ключу, указанному в параметре.

Например :

{{ value|dictsort:"name" }}

Если value содержит:

[
    {'name': 'zed', 'age': 19},
    {'name': 'amy', 'age': 22},
    {'name': 'joe', 'age': 31},
]

результат будет:

[
    {'name': 'amy', 'age': 22},
    {'name': 'joe', 'age': 31},
    {'name': 'zed', 'age': 19},
]

Вы также можете делать более сложные вещи, например:

{% for book in books|dictsort:"author.age" %}
    * {{ book.title }} ({{ book.author.name }})
{% endfor %}

Если books это:

[
    {'title': '1984', 'author': {'name': 'George', 'age': 45}},
    {'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
    {'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
]

тогда результат будет:

* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)

dictsort может также отсортировать список списков (или любой другой объект реализации __getitem__() ) по элементам с заданным индексом. Например :

{{ value|dictsort:0 }}

Если value содержит:

[
    ('a', '42'),
    ('c', 'string'),
    ('b', 'foo'),
]

результат будет:

[
    ('a', '42'),
    ('b', 'foo'),
    ('c', 'string'),
]

Вы должны передавать индекс как целое число, а не как строку. Следующий код дает пустой результат:

{{ values|dictsort:"0" }}

dictsortreversed

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

divisibleby

Возвращает True , делится ли значение на параметр.

Например :

{{ value|divisibleby:"3" }}

Если value содержит 21 , результат будет

escape

Экранирует HTML-код. В частности, он выполняет следующие замены:

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

Применение escape к переменной, которая обычно подвергается автоматическому экранированию результата, будет выполнять только дополнительную проверку escape. Таким образом, эту функцию можно без проблем использовать даже в контексте автоматического выхода. Если вы хотите форсировать выхлоп во всех случаях, используйте фильтр force_escape .

Например, вы можете применить escape к некоторым полям, когда autoescape неактивно:

{% autoescape off %}
    {{ title|escape }}
{% endautoescape %}

escapejs

Экранирует символы в содержимом JavaScript. Это не делает текст надежным для использования в литеральных шаблонах HTML или JavaScript, но защищает от синтаксических ошибок при использовании шаблонов для генерации JavaScript / JSON.

Например :

{{ value|escapejs }}

Если value содержит , то результат будет ."testing\r\njavascript 'string\" <b>escaping</b>" "testing\\u000D\\u000Ajavascript \\u0027string\\u0022 \\u003Cb\\u003Eescaping\\u003C/b\\u003E"

filesizeformat

Форматирует значение как удобочитаемый размер файла (например , и т. Д.).'13 Kio' '4.1 Mio' '102 octets'

Например :

{{ value|filesizeformat }}

ЕСЛИ value содержит 123456789, результат будет .117.7 Mio

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

Строго говоря, filesizeformat не соответствует Международной системе единиц, которая рекомендует использовать KiB, MiB, GiB и т. Д. когда размер байта вычисляется в степени 1024 (как здесь). Django вместо этого использует традиционные имена единиц (КБ, МБ, ГБ и т. Д.), Соответствующие более часто используемым именам (примечание редактора: французский перевод использует префиксы SI Kio, Mio и т. Д.).

first

Возвращает первый элемент в списке.

Например :

{{ value|first }}

Если value содержит список , то результат будет .['a', 'b', 'c'] 'a'

floatformat

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

valeur шаблон дисплей
34.23234 {{ valeur|floatformat }} 34,2
34.00000 {{ valeur|floatformat }} 34
34.26000 {{ valeur|floatformat }} 34,3

Когда передается целочисленный параметр, floatformat округляет число до количества десятичных знаков, указанного параметром. Например :

valeur шаблон дисплей
34.23234 {{ valeur|floatformat:3 }} 34,232
34.00000 {{ valeur|floatformat:3 }} 34,000
34.26000 {{ valeur|floatformat:3 }} 34,260

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

valeur шаблон дисплей
34.23234 {{ valeur|floatformat:"0" }} 34
34.00000 {{ valeur|floatformat:"0" }} 34
39.56000 {{ valeur|floatformat:"0" }} 40

Если переданный параметр floatformat отрицательный, число будет округлено до указанного количества десятичных знаков, но только если есть десятичная часть для отображения. Например :

valeur шаблон дисплей
34.23234 {{ valeur|floatformat:"-3" }} 34,232
34.00000 {{ valeur|floatformat:"-3" }} 34
34.26000 {{ valeur|floatformat:"-3" }} 34,260

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

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

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

force_escape

Применяет экранирование HTML к строке ( escape подробности см. В фильтре ). Этот фильтр применяется немедленно и возвращает новую экранированную строку. Это может быть полезно в том редком случае, когда вам нужно несколько последовательных экранирований или вы хотите применить другие фильтры к экранированному результату. Обычно достаточно использовать фильтр escape .

Например, если вы хотите избежать тегов HTML, <p> созданных фильтром linebreaks :

{% autoescape off %}
    {{ body|linebreaks|force_escape }}
{% endautoescape %}

get_digit

Для целого числа возвращает указанную цифру, где 1 - крайняя правая цифра, 2 - вторая правая цифра и т. Д. Возвращает исходное значение, если входные данные недействительны (если значение или параметр не являются целыми числами или если параметр меньше 1). В противном случае результат всегда целое число.

Например :

{{ value|get_digit:"2" }}

ЕСЛИ value содержит 123456789 , то результат будет 8 .

iriencode

Преобразует интернационализированный идентификатор ресурса (IRI) в строку, которая может быть включена в URL-адрес. Это необходимо при попытке вставить в URL-адреса строки, содержащие символы, отличные от ASCII.

Вы можете легко использовать этот фильтр для канала, который уже прошел через фильтр urlencode .

Например :

{{ value|iriencode }}

Если value содержит "?test=1&moi=2" , то результат будет "?test=1&amp;moi=2" .

join

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

Например :

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

Если value содержит список , то результат будет .['a', 'b', 'c'] "a // b // c"

json_script

Безопасно преобразует объект Python в JSON, заключенный в тег <script> , для использования из JavaScript.

Параметр : HTML "id" тега <script> .

Например :

{{ value|json_script:"hello-data" }}

Если value содержит словарь , результатом будет:{'hello': 'world'}

<script id="hello-data" type="application/json">{"hello": "world"}</script>

Полученные данные можно получить в JavaScript следующим образом:

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

XSS-атак можно избежать за счет экранирования символов «<», «>» и «&». Например, если value содержит , результатом будет:{'hello': 'world</script>&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; одиночный разрыв строки становится разрывом строки HTML ( <br> ), а разрыв строки, за которой следует пустая строка, становится разрывом абзаца ( </p> ).

Например :

{{ value|linebreaks }}

Если value содержит , то результат будет ."Joël\nest une limace" <p>Joël<br>est une limace</p>

linebreaksbr

Преобразует все разрывы строк в текстовом содержимом в разрывы строк HTML ( <br> ).

Например :

{{ value|linebreaksbr }}

Если value содержит , то результат будет ."Joël\nest une limace" Joël<br>est une limace

linenumbers

Отображает текст по нумерации его строк.

Например :

{{ value|linenumbers }}

Если value содержит:

one
two
three

результат будет:

1. one
2. two
3. three

ljust

Выравнивает значение по левому краю в поле заданной ширины.

Параметр: размер поля

Например :

"{{ value|ljust:"10" }}"

Если value содержит "Django" , то результат будет ."Django    "

lower

Преобразует строку в нижнем регистре.

Например :

{{ value|lower }}

Если value содержит , то результат будет .J'aime FOLLEMENT cet album! j'aime follement cet album!

make_list

Возвращает значение, преобразованное в список. Для строки это будет список символов. Для целого числа параметр сначала вставляется в строку, прежде чем составлять ее список.

Например :

{{ value|make_list }}

Если value содержит строку "Joël" , результатом будет список . Если он содержит , результатом будет список .['J', 'o', 'ë', 'l'] value 123 ['1', '2', '3']

phone2numeric

Преобразует номер телефона (который может содержать буквы) в его числовой эквивалент.

В качестве начального числа необязательно должен быть действующий номер телефона. Любая строка символов будет без промедления преобразована.

Например :

{{ value|phone2numeric }}

Если value равно 800-COLLECT , то результат будет 800-2655328 .

pluralize

Возвращает суффикс множественного числа , если значение отличается от 1 , '1' или объект длины 1. По умолчанию суффикс 's' .

Пример:

You have {{ num_messages }} message{{ num_messages|pluralize }}.

Если num_messages содержит 1 , результат будет. Если содержит , результат будетYou have 1 message. num_messages 2 You have 2 messages.

Для слов, требующих суффикса, отличного от 's' , вы можете указать альтернативный суффикс в качестве параметра фильтра.

Пример:

You have {{ num_walruses }} walrus{{ num_walruses|pluralize:"es" }}.

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

Пример:

You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}.

Заметка

Используется blocktranslate для множественного числа переведенных строк.

pprint

Адаптер pprint.pprint() , чтобы быть действительно зарезервированным для отладки.

random

Возвращает случайный элемент из указанного списка.

Например :

{{ value|random }}

Если value содержит список , результат может быть .['a', 'b', 'c', 'd'] "b"

rjust

По правому краю выравнивает значение в поле заданной ширины.

Параметр: размер поля

Например :

"{{ value|rjust:"10" }}"

Если value содержит "Django" , то результат будет ."    Django"

safe

Отмечает строку как не требующую экранирования перед отображением в HTML-коде. Когда автоматический выход отключен, этот фильтр не действует.

Заметка

Если вы объедините фильтры в цепочку, фильтр, примененный впоследствии, safe может снова сделать контент ненадежным. Например, следующий код отображает переменную как есть, без экранирования:

{{ var|safe|escape }}

safeseq

Применяет фильтр safe к каждому элементу в списке. Полезно в сочетании с другими фильтрами, которые влияют на списки, например join . Например :

{{ some_list|safeseq|join:", " }}

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

slice

Возвращает сегмент списка.

Использует тот же синтаксис, что и сегментация списка Python. См. Введение на https://www.diveinto.org/python3/native-datatypes.html#slicinglists .

Пример:

{{ some_list|slice:":2" }}

Если some_list содержит , то результат будет .['a', 'b', 'c'] ['a', 'b']

slugify

Преобразует в ASCII. Преобразует пробелы в тире. Удаляет символы, не являющиеся буквенно-цифровыми, знаками подчеркивания или тире. Преобразует в нижний регистр. Также удаляются пробелы в начале и конце строки.

Например :

{{ value|slugify }}

Если value содержит , то результат будет ."Joël est une limace" joel-est-une-limace

stringformat

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

Например :

{{ value|stringformat:"E" }}

ЕСЛИ value содержит 10 , то результат будет 1.000000E+01 .

striptags

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

Например :

{{ value|striptags }}

Если value содержит , то результат будет ."<b>Joël</b> <button>est</button> une <span>limace</span>" "Joël est une limace"

Нет гарантии безопасности

Обратите внимание, что striptags нет гарантии, что результирующий контент больше не будет содержать разметку HTML, особенно если входящий контент не является допустимым кодом HTML. Поэтому НИКОГДА не применяйте фильтр safe к контенту из striptags . Если вы ищете более надежное решение, вы можете использовать библиотеку Python bleach , особенно ее чистый метод .

time

Форматирует время в указанном формате.

Указанный формат может быть предопределенным форматом TIME_FORMAT или настраиваемым форматом, как для фильтра date . Обратите внимание, что предопределенный формат зависит от активного языка.

Например :

{{ value|time:"H:i" }}

Если value эквивалентно datetime.datetime.now() , результат будет "01:23" .

Обратите внимание, что вы можете использовать обратную косую черту для строки формата, если хотите использовать «сырое» значение. В этом примере «h» и «m» экранируются обратной косой чертой, в противном случае каждая из них будет интерпретирована как строка формата для отображения часа и месяца соответственно:

{% value|time:"H\h i\m" %}

Отображаемый результат: «01ч 23м».

Другой пример :

Если предположить , что USE_L10N это True и что это LANGUAGE_CODE относится, например "de" , то для:

{{ value|time:"TIME_FORMAT" }}

результат будет "01:23" (спецификатор формата "TIME_FORMAT" локали , de предоставленный Django, содержит "H:i" ).

Фильтр time принимает параметры только для времени дня в строке формата, но не для даты. Если вам нужно отформатировать дату, используйте фильтр date (возможно, с, time если вам нужно получить datetime полное значение ).

Существует одно исключения из вышеуказанного правила: когда он принимает значение , datetime содержащее информацию о временной зоне (экземпляр в datetime сознании ), фильтр time принимает индикаторы формата , связанные с часовыми поясами 'e' , 'O' , 'T' и 'Z' .

Если строка формата не указана, используется формат TIME_FORMAT :

{{ value|time }}

идентичен:

{{ value|time:"TIME_FORMAT" }}

timesince

Форматирует дату относительно этой даты (например, «4 дня, 6 часов»).

Принимает необязательный параметр в качестве переменной, содержащей дату для использования в качестве точки сравнения (без параметров точкой сравнения является сейчас ). Например, если blog_date это экземпляр даты, представляющий полночь 1 июня 2006 г., и comment_date экземпляр даты, представляющий 1 июня 2006 г. в 8:00 утра, следующий код вернет «8 часов»:

{{ blog_date|timesince:comment_date }}

При сравнении наивной и сознательной (относительно часового пояса) даты / времени возвращается пустая строка.

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

timeuntil

Аналогично timesince , за исключением того, что он измеряет время от текущего момента до указанной даты или даты / времени. Например, если это 1 июня 2006 г., и conference_date экземпляр даты, содержащий 29 июня 2006 г., вернет «4 недели».{{ conference_date|timeuntil }}

Принимает необязательный параметр как переменные , содержащий дату , чтобы использовать в качестве точки сравнения (вместо того , в настоящее время ). Если from_date содержит 22 июня 2006 г., следующий код вернет "1 неделя":

{{ conference_date|timeuntil:from_date }}

При сравнении наивной и сознательной (относительно часового пояса) даты / времени возвращается пустая строка.

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

title

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

Например :

{{ value|title }}

Если value содержит , то результат будет ."mon PREMIER article" "Mon Premier Article"

truncatechars

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

Параметр: максимальное количество символов результата

Например :

{{ value|truncatechars:7 }}

Если value содержит , то результат будет ."Joël est une limace" "Joël e…"

truncatechars_html

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

Например :

{{ value|truncatechars_html:7 }}

Если value содержит , то результат будет ."<p>Joël est une limace</p>" "<p>Joël e…</p>"

Разрывы строк в содержимом HTML сохраняются.

truncatewords

Обрезать строку после определенного количества слов.

Параметр: максимальное количество слов в результате

Например :

{{ value|truncatewords:2 }}

Если value содержит , то результат будет ."Joël est une limace" "Joël est …"

Разрывы строк внутри значения будут удалены.

truncatewords_html

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

Этот фильтр менее эффективен truncatewords , поэтому его следует использовать только при работе с текстом, содержащим HTML.

Например :

{{ value|truncatewords_html:2 }}

Если value содержит , то результат будет ."<p>Joël est une limace</p>" "<p>Joël est …</p>"

Разрывы строк в содержимом HTML сохраняются.

unordered_list

Принимает вложенные списки и рекурсивно обрабатывает их для получения неупорядоченного списка HTML без открывающих и закрывающих тегов <ul>.

Список должен быть в правильном формате. Например, если var содержит , результатом будет:['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']] {{ var|unordered_list }}

<li>States
<ul>
        <li>Kansas
        <ul>
                <li>Lawrence</li>
                <li>Topeka</li>
        </ul>
        </li>
        <li>Illinois</li>
</ul>
</li>

upper

Преобразует строку в верхнем регистре.

Например :

{{ value|upper }}

Если value равно , то результат будет ."Joël est une limace" "JOËL EST UNE LIMACE"

urlencode

Экранирует значение для включения в URL.

Например :

{{ value|urlencode }}

Если value равно "https://www.example.org/foo?a=b&c=d" , то результат будет "https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd" .

Можно указать необязательный параметр, содержащий символы, которые нельзя экранировать.

Без этого параметра символ «/» считается безопасным. Можно указать пустую строку, чтобы указать, что все символы должны быть экранированы. Например :

{{ value|urlencode:"" }}

Если value равно "https://www.example.org/" , то результат будет "https%3A%2F%2Fwww.example.org%2F" .

urlize

Преобразует URL-адреса и адреса электронной почты в тексте в гиперссылки.

Этот тег шаблона работает со ссылками с префиксом http:// , https:// или www. . Например, https://goo.gl/aia1t будет преобразован, но goo.gl/aia1t не будет.

Он также преобразует ссылку «доменные имена» , если они заканчиваются одним из первых основных доменов высшего уровня ( .com , .edu , .gov , .int , .mil , .net и .org ). Например, djangoproject.com будет преобразован.

Ссылки могут заканчиваться знаками препинания (точки, запятые, закрывающая скобка) и начинаться знаками препинания (открывающая скобка); urlize впрочем, беспокоить не буду.

Ссылки, созданные с помощью, urlize получают атрибут rel="nofollow" .

Например :

{{ value|urlize }}

Если value равно , то результат будет ."Visitez www.djangoproject.com" "Visitez <a href="http://www.djangoproject.com" rel="nofollow">www.djangoproject.com</a>"

Помимо ссылок веб-типа, urlize также преобразует адреса электронной почты в ссылки mailto: . Если value содержит , то результат будет ."Envoyez les questions à [email protected]" "Envoyez les questions à <a href="mailto:[email protected]">[email protected]</a>"

Фильтр urlize также принимает необязательный параметр autoescape . Если это действительно так True , текст ссылки и URL-адреса будут экранированы фильтром escape Django. По умолчанию autoescape это True .

Заметка

Если urlize применяется к тексту, который уже содержит теги HTML, или к адресам электронной почты, содержащим одинарные кавычки ( ' ), все будет работать не так, как ожидалось. Применяйте этот фильтр только к обычному тексту.

urlizetrunc

Преобразует URL-адреса и адреса электронной почты в тексте в гиперссылки точно так же, как urlize , но обрезает текст из URL-адресов, длина которых превышает указанное ограничение на количество символов.

Параметр: максимальное количество символов, которое будет содержать текст ссылки после усечения, если необходимо, включая эллипс, добавленный путем усечения, если таковой имеется.

Например :

{{ value|urlizetrunc:15 }}

Если value равно , то результат будет ."Visitez www.djangoproject.com" 'Visitez <a href="http://www.djangoproject.com" rel="nofollow">www.djangoproj…</a>'

Как и urlize , этот фильтр следует применять только к чистому тексту.

wordcount

Возвращает количество слов.

Например :

{{ value|wordcount }}

Если value равно , то результат будет ."Joël est une limace" 4

wordwrap

Добавляет разрывы строк на основе максимальной длины строки.

Параметр: количество символов, после которого в тексте добавляется разрыв строки.

Например :

{{ value|wordwrap:5 }}

Если value равно , результат будет:Joel is a slug

Joel
is a
slug

yesno

Соответствует значениям true ( True ), false ( False ) и, возможно, None соответственно строкам «да», «нет», «возможно» или настраиваемому списку строк, разделенных запятыми, и возвращает строку, соответствующую значению. передается:

Например :

{{ value|yesno:"yeah,no,maybe" }}
Стоимость настройка плакат
True   yes
True "yeah,no,maybe" yeah
False "yeah,no,maybe" no
None "yeah,no,maybe" maybe
None "yeah,no" no (преобразуется None в, False если совпадение не указано None )

Теги и фильтры интернационализации

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

i18n

Эта библиотека позволяет указывать текст для перевода в шаблонах. Для того, чтобы активировать его, установить его , USE_I18N чтобы True затем загрузить его .{% load i18n %}

Смотрите Интернационализация: в коде шаблона .

l10n

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

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

tz

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

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

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

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

django.contrib.humanize

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

static

static

Для ссылки на статические файлы, сохраненные в STATIC_ROOT , Django предоставляет тег шаблона static . Если приложение django.contrib.staticfiles установлено, тег будет обслуживать файлы, используя метод url() хранения, представленный в STATICFILES_STORAGE . Например :

{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!">

Он также может использовать стандартные переменные контекста; например, предполагая, что user_stylesheet в шаблон передана переменная :

{% load static %}
<link rel="stylesheet" href="{% static user_stylesheet %}" type="text/css" media="screen">

Если вы хотите получить статический URL-адрес, не отображая его, вы можете сделать немного другой вызов:

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}">

Использование шаблонов Jinja2

См. Jinja2 Информацию об использовании тега static с Jinja2.

get_static_prefix

Предпочтение следует отдать тегу шаблона static , но если вам нужен более точный контроль над тем, где и как STATIC_URL вводится шаблон, вы можете использовать тег шаблона get_static_prefix :

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!">

Существует также вторая форма, которую можно использовать для предотвращения ненужной обработки, если вам нужно одно и то же значение несколько раз:

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!">
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!">

get_media_prefix

Аналогично get_static_prefix , get_media_prefix создайте переменную шаблона, содержащую префикс мультимедиа MEDIA_URL , например:

{% load static %}
<body data-media-url="{% get_media_prefix %}">

Сохраняя значение в атрибуте данных, мы гарантируем, что оно правильно экранировано, если мы хотим использовать его в контексте JavaScript.

Copyright ©2021 All rights reserved