В дополнение к тегам Django также поддерживает фильтры, которые позволяют произвести некоторую простешую обработку значений внутри шаблонов. Полный список фильтров можно найти в документации. Здесь же рассмотрим только некоторые наиболее используемые.
Фильтр add добавляет к одному значению другое.
значение1 | add: значение2
Например:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Django on METANIT.COM</title> </head> <body> <div> {% with message="Hello" %} <h2>{{ message|add:" Django" }}</h2> {% endwith %} </div> </body> </html>
В данном случае определяется переменная message (это также могли бы быть данные, передаваемые из представления). Затем при выводе значения этой переменной к ней добавляется строка " Django"
Фильтр capfirst делает первую букву заглавной:
{{ message|capfirst }}
Например, если message равно "django", то послет применения фильтра на веб-странице будет выведено "Django".
Фильтр cut удаляет из строки определенную подстроку:
{% with message="Я был дома" %} {{ message|cut:"был" }} {% endwith %}
В данном случае из строки "Я был дома" удаляется подстрока "был", поэтому шаблон выведет "Я дома"
Фильтр default проверяет значение, и если оно равно False, то возвращает некоторое значение по умолчанию.
{% with isEnabled=False %} {{ isEnabled|default:"unabled" }} {% endwith %}
В данном случае переменная isEnabled равна False, поэтому шаблон выведет "unabled"
При этом сама переменная необязательно должна хранить именно True или False, это может быть любое выражение, которое можно привести в значению True/False. Например:
{% with name="" %} {{ name|default:"Undefined" }} {% endwith %}
В данном случае переменная name представляет пустую строку, поэтому при применении фильтра получим False, а фильтр возвратит строку "Undefined".
Похожим действием обладает фильтр default_if_none - он возвращает значение по умолчанию, если переданное ему значение равно None:
{% with user=None %} {{ user|default_if_none:"Undefined" }} {% endwith %}
floatformat форматирует числа с плавающей точкой.
Если фильтру не передается аргумент, то число округляется до одного знака после запятой:
Значение |
Шаблон |
Результат |
34.23234 |
{{ value|floatformat }} |
34.2 |
34.00000 |
{{ value|floatformat }} |
34 |
34.26000 |
{{ value|floatformat }} |
34.3 |
Фильтру можно передать числовой аргумент, который указывает, до скольких знаков после запятой надо округлять:
Значение |
Шаблон |
Результат |
34.23234 |
{{ value|floatformat:3 }} |
34.232 |
34.00000 |
{{ value|floatformat:3 }} |
34.000 |
34.26000 |
{{ value|floatformat:3 }} |
34.260 |
Если аргумент - отрицательное число, то число также округляется до определенного количества знака после запятой. Однако если дробная часть состоит из одних нулей, то нули при этом отсекуются:
Значение |
Шаблон |
Результат |
34.23234 |
{{ value|floatformat:"-3" }} |
34.232 |
34.00000 |
{{ value|floatformat:"-3" }} |
34 |
34.26000 |
{{ value|floatformat:"-3" }} |
34.260 |
Аргумент 0 позволяет округлить число до ближайщего целого:
Значение |
Шаблон |
Результат |
34.23234 |
{{ value|floatformat:"0" }} |
34 |
34.00000 |
{{ value|floatformat:"0" }} |
34 |
39.56000 |
{{ value|floatformat:"0" }} |
40 |
Если аргумент имеет суффикс g, то применяется группировка с использованием разделителя разрядов в соответствии с текущей локалью:
Значение |
Шаблон |
Результат |
34232.34 |
{{ value|floatformat:"2g" }} |
34,232.34 |
34232.06 |
{{ value|floatformat:"g" }} |
34,232.1 |
34232.00 |
{{ value|floatformat:"-3g" }} |
34,232 |
При выводе применяется текущая локаль проекта. Например, если мы откроем файл settings.py, то можем там найти переменную LANGUAGE_CODE, которая определяет локаль:
LANGUAGE_CODE = 'en-us'
По умолчанию применяется американский вариант английского языка и соответствующие им настройки локали. Соответственно разделителем между целой и дробной частью будет точка, а между разрядами - запятая. Но, например, изменим на русскоязычную культуру:
LANGUAGE_CODE = 'ru-ru'
Теперь для кода
{% with value=34232.34 %} {{ value|floatformat:"2g" }} {% endwith %}
Тмы получим вывод
34 232,34
Если же необходимо отключить локализацию, аргументу добавляется суффикс u:
{{ value|floatformat:"2u" }}
Фильтр date применяется к объекту datetime и в качестве аргумента получает следующие спецификаторы даты и времени:
d: день месяца в виде двух цифр (одна цифра дополняется нулем слева). Диапазон значений от '01' до '31'
j: день месяца без дополнения нулем. Диапазон значений от '1' до '31'
D: день недели в текстовом виде в виде трех символов, например, 'Fri'
l: день недели в полном виде, например, 'Friday'
S: возвращает английский суффикс для порядковых числительных для дня месяца. Возможные значения: 'st', 'nd', 'rd' и 'th'
w: номер деня недели. Значения в диапазоне от'0' (воскресенье) до '6' (суббота)
z: номер дня года. Диапазон значений от 1 до 366
W: номер недели года (первым днем недели считается понедельник). Значения от 1 до 53
m: номер месяца в виде двух цифр. Диапазон значений от '01' до '12'
n: номер месяца в виде двух цифр без предварения нулем. Диапазон значений от '1' до '12'
M: текстовое значение месяца в виде трех символов. Например, 'Jan'
b: текстовое значение месяца в виде трех символов в нижнем регистре. Например, 'jan'
E: локализованное название месяца. Например, 'августа' ("август" в родительном падеже)
F: полное название месяца. Например, 'January'
N: аббревиатура месяца. Например, 'Jan.', 'Feb.', 'March', 'May'
t: число дней в текущем месяце. Значения от 28 до 31
y: двухчисловой код года с дополнением нулем. Диапазон значений от '00' до '99'
Y: четырехчисловой код года с дополнением нулем. Диапазон значений от '0001' до '9999'
L: является ли год високосным. Значения: True(является) и False (не является)
o: ISO-8601 week-numbering year,
g: час в 12-часовом формате без дополнения нулем. Диапазон значений от '1' до '12'
G: час в 24-часовом формате без дополнения нулем. Диапазон значений от '0' до '23'
h: час в 12-часовом формате с дополнением нулем. Диапазон значений от'01' до '12'
H: час в 24-часовом формате с дополнением нулем. Диапазон значений от'00' до '23'
i: минуты от '00' до '59'
s: секунды от '00' до '59'
u: микросекунды от 000000 до 999999
a: 'a.m.' или 'p.m.'
A: 'AM' или 'PM'
f: время в 12-часовом формате с минутами. Например, '1:30'
P: время в 12-часовом формате с минутами и "a.m."/"p.m.". Например, '12:30 p.m.'
e: часовая зона, например, '', 'GMT', '-500', 'US/Eastern', etc.
O: смещение в часах относительно гринвича. Например, '+0200'
T: временная зона текущего компьютера. 'EST', 'MDT'
c: дата и время в формате ISO 8601. Например, 2008-01-02T10:30:00.000123+02:00 или 2008-01-02T10:30:00.000123
r: дата и время в формает RFC 5322
Также можно передать ряд предустановленных констант:
DATE_FORMAT
DATETIME_FORMAT
SHORT_DATE_FORMAT
SHORT_DATETIME_FORMAT
Например, в представлении в шаблон передается некоторая дата:
from datetime import datetime from django.shortcuts import render def index(request): return render(request, "index.html", context={"my_date": datetime.now()})
Выведем эту дату в шаблоне:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Django on METANIT.COM</title> </head> <body> <div> <h2>{{ my_date|date:"d.m.Y" }}</h2> <h2>{{ my_date|date:"H:i" }}</h2> <h2>{{ my_date|date:"c" }}</h2> <h2>{{ my_date|date:"SHORT_DATE_FORMAT" }}</h2> </body> </html>
Ряд фильтров предназначены для работы со списками.
Фильтр join объединяет элементы списка, используя определенный разделитель:
{{ users|join:", "}}
Предположим, что здесь users
- это список ["Tom", "Sam", "Bob", "Mike"]
, то после применения фильтра получится строка "Tom, Sam, Bob, Mike".
Фильтр slice получает часть списка. Для извлечения часть списка он получает начальный и конечный индексы для извлечения элементов:
slice:"start:" slice:":end" slice:"start:end"
параметр start указывает на индекс элемента, начиная с которого надо скопировать элементы, а через параметр end передается индекс элемента, до которого нужно копировать список. Если start или end не указываются, то start по умолчанию равен 0, а end - на длину списка. Например
{{ {{ users|slice:"1:3" }}}}
Здесб извлекаются элементы с 1 по 3 индекс (не включая), то есть получится список ["Sam", "Bob"]
.
Фильтр length возвращает длину списка (также этот фильтр можно применять для нахождения длины строки).
{{ users|length}}
Здесь фильтр возвратит 4.