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

Последнее обновление: 17.08.2022

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

autoescape

Тег autoescape позволяет автоматически экранировать ряд символов HTML и тем самым сделать вывод на страницу более безопасным. В частности, производятся следующие замены:

  • < заменяется на &lt;

  • > заменяется на &gt;

  • ' (одинарная кавычка) заменяется на &#x27;

  • " (двойная кавычка) заменяется на &quot;

  • & заменяется на &amp;

Например, пусть у нас будет определен следующий шаблон index.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Django на METANIT.COM</title>
</head>
<body>
    {{ body }}

    {% autoescape off %}
        {{ body }}
    {% endautoescape %}
</body>
</html>

Здесь в шаблоне два раза выводится содержимое переменной body. Однако сначала она выводится сама по себе, в во втором случае ее вывод помещается в между тегами {% autoescape %} и {% endautoescape %}. Тег в качестве параметра принимает одно из значений: on (экранирование включено) и off (экранирование отключено). В данном случае тегу передается значение off, а это значит, что внутри блока тега autoescape экранирование отключено.

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

from django.shortcuts import render
 
def index(request):
    return render(request, "index.html", context = {"body": "<h1>Hello World!</h1>"})

Здесь в шаблон передается некоторая строка с кодом HTML. По умолчанию шаблоны применяют экранирование. Поэтому на веб-странице мы увидим код html в текстовом виде, а во втором случае переданные данные будут интпретированы непосредственно как код html:

Тег autoescape и экранирование тегов html в шаблонах Django

Комментарии

Для определения комментариев в шаблоне применяется тег comment: все, что помещается между тегами {% comment %} и {% endcomment %}, игнорируется при генерации html-страницы.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Django на METANIT.COM</title>
</head>
<body>

    {% comment %}
        <p>Вывод содержимого в шаблон Django</p>
    {% endcomment %}

    {{ body }}    
</body>
</html>

if..else

Тег if оформляется в виде блока:

{% if условие %}
	содержимое блока
{% endif %}

Этот тег оценивает некоторое условие, которое должно возращать True или False: если возвращается True, то выводится содержимое блока {% if %}.

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

from django.shortcuts import render

def index(request):
    data = {"n" : 5}
    return render(request, "index.html", context=data)

В шаблоне в зависимости от значения переменной n мы можем выводить определенный контент:

{% if n > 0 %}
	<p>Число положительное</p>
{% endif %}

То есть если n больше 0, то будет выводиться, что число положительное. Если n меньше или равно 0, ничего не будет выводиться.

С помощью дополнительного тега {% else %} можно вывести контент в случае, если условие после if равно False:

{% if n > 0 %}
	<p>Число положительное</p>
{% else %}
	<p>Число отрицательное или равно нулю</p>
{% endif %}

С помощью тега {% elif %} можно проверить дополнительные условия, если условие в if равно False:

{% if n > 0 %}
    <p>Число положительное</p>
{% elif n < 0 %}
    <p>Число отрицательное</p>
{% else %}
    <p>Число равно нулю</p>
{% endif %}

Стоит отметить, что в условии, которое передается тегу if, можно применять ряд операторов, которые возвращают True или False: ==, !=, <, >, <=, >=, in, not in, is, is not, and, or, not.

{% if a > 0 and b > 0 %}
    <p>{{ a }}</p>
{% else %}
    <p>{{ b }}</p>
{% endif %}

Циклы

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

{% for element in collection %} 
 действия с element
{% endfor %}

Например, пусть из представления в шаблон передается некоторый список:

from django.shortcuts import render

def index(request):
    langs = ["Python", "JavaScript", "Java", "C#", "C++"]
    return render(request, "index.html", context={"langs": langs})

Выведем элементы списка langs в шаблоне с помощью тега for:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Django on METANIT.COM</title>
</head>
<body>
    <ul>
        {% for lan in langs %}
        <li>{{ lan }}</li>
        {% endfor %}
    </ul>
</body>
</html>
Тег For и перебор списков в шаблонах на Django

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

<ul>
	{% for lan in langs %}
	<li>{{ lan }}</li>
	{% empty %}
	<li>Langs array is empty</li>
	{% endfor %}
</ul>

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

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Django on METANIT.COM</title>
</head>
<body>
    {% for key, value in data.items %}
        <p>{{ key }}: {{ value }}</p>
    {% endfor %}
</body>
</html>

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

from django.shortcuts import render
 
def index(request):
    data = {"red": "красный", "green": "зеленый", "blue":"синий"}
    return render(request, "index.html", context={"data": data})

Определение переменных

Тег {% with %} позволяет определить переменную и использовать ее внутри блока тега. Например:

{% with name="Tom" age=29 %}
	<div>
        <p>Name: {{ name }}</p>
        <p>Age: {{ age }}</p>
    </div>
{% endwith %}

В данном случае определены две переменных: name и age, которые мы можем использовать внутри блока {% with%} ... {% endwith %}. Однако вне этого блока эти переменные использоваться не могут.

Даты

Тег {% now "формат_данных" %} позволяет вывести системное время. В качестве параметра тегу now передается формат данный, который указывает, как форматировать время и дату.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Django on METANIT.COM</title>
</head>
<body>
    <p>{% now "Y" %}</p>
    <p>{% now "F j Y" %}</p>
    <p>{% now "N, j, Y" %}</p>
    <p>{% now "N j, Y, P" %}</p>
</body>
</html>
Форматирование дат в Django

Символ "Y" передает год в виде четырех цифр, "y" - берет из года последние две цифры. "F" - полное название месяца, "N" -сокращенное название месяца. "j" - день месяца. "P" - время. Все возможные форматы для вывода даты и времени можно посмотреть в документации

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

TIME_ZONE = 'UTC'

То есть отсчитывается относительно UTC. Это может быть не всегда удобно. И соответственно мы можем изменить ее значение на нужное. Например, настройка для московского часового пояса:

TIME_ZONE = 'Europe/Moscow'
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850