Django 5 для начинающих

Прогресс по курсу:  9/1004

2.6 Шаблоны, часть 1.
5 из 13 шагов пройдено
0 из 36 баллов  получено

Использование специальных тегов в шаблонах НТМL-страниц

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

Тег для вывода текущих даты и времени

Для вывода дат в Django используется следующий тег:

{% now "формат_данных" %}

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

Пример:

<p>Год в виде четырех цифр - {% now "Y" %}</p>
<p>Год в виде последних двух цифр - {% now "y" %}</p>
<p>Полное название месяца - {% now "F" %}</p>
<p>Сокращенное название месяца - {% now "M" %}</p>
<p>Номер месяца, с ведущим нулём - {% now "m" %}</p>
<p>Номер месяца, без ведущего нуля - {% now "n" %}</p>
<p>Аббревиатура месяца  - {% now "N" %}</p>
<p>День месяца, с ведущим нулём - {% now "d" %}</p>
<p>День месяца, без ведущего нуля - {% now "j" %}</p>
<p>День недели - текст - {% now "l" %}</p>
<p>Часы (0-12) - {% now "h" %}</p>
<p>Часы (0-24) - {% now "H" %}</p>
<p>Минуты (0-59) - {% now "i" %}</p>
<p>Секунды (0-59) - {% now "s" %}</p>
<p>Дата (день/месяц/год) - {% now "j/m/Y" %}</p>
<p>Время (час:мин:сек) - {% now "H:i:s" %}</p>

 

Тег для вывода информации no условию

Тег для вывода информации в зависимости от соблюдения какого-либо условия выглядит следующим образом:

{% if %}
{% elif %}
{% else %}
{% endif %}

В качестве параметра тегу if передается выражение, которое должно возвращать True или False.

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


Предположим, что из представления views в шаблон передаются некоторые значения - например, возраст клиента age.

Изменим следующим образом текст функции def index() в файле views.py:

from django.shortcuts import render


def index(request):
    data = {"age": 50}
    return render(request, "blog/index.html", context=data)


В шаблоне страницы в зависимости от значения переменной age мы можем выводить разную информацию. Например:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Учу Django</title>
</head>
<body>
<p>Анализ возраста клиента</p>
{% if age > 65 %}
    <p>Клиент достиг пенсионного возраста</p>
{% else %}
    <p>Клиент не является пенсионером</p>
{% endif %}
</body>
</html>

На этой странице мы проверяем условие - является ли клиент пенсионером.

Если возраст клиента больше 65 лет, то на странице будет выдано сообщение Клиент достиг пенсионного возраста, в противном случае будет выведено сообщение Клиент не является пенсионером.

 

Тег для вывода информации в цикле

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

{% for "Индекс элемента" in "Коллекция элементов" %}
{% endfor %}

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

Изменим следующим образом текст функции index() в файле views.py:

from django.shortcuts import render


def index(request):
    cat = ["Python", "Java", "JS", "Go", "C#", "Kotlin"]
    return render(request, "blog/index.html", context={"cat": cat})

Чтобы, в шаблоне страницы blog/index.html в цикле выводить информацию из списка cat, напишем следующий код:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Учу Django</title>
</head>
<body>
<p>Категории</p>
<ul>
{% for i in cat %}
    <li>{{ i }}</li>
{% endfor %}
</ul>
</body>
</html>


Проверим работу перейдя по адресу - http://127.0.0.1:8000


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

<р>Категории</р>
<ul>
{% for i in cat %}
    <li>{{ i }}</li>
{% empty %}
    <li>Категории пусты</li>
{% endfor %}
</ul>

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

Если вставить первый пример с датой/временем в index.html, получается нечто неожиданное:

Вместо латинской "p" повсеместно используется кириллическая "р" , как и во всех остальных случаях, когда написание букв совпадает. А вместо "l" (строчная "L") вообще "1".

Единственное разумное объяснение - это отсканированный и распознанный текст )))

Было бы неплохо поправить... По рендеру сразу видно, где не те буквы

Изменен ilya kutaev

@ilya_kutaev, спасибо, исправил.

@Дмитрий_Селезнев, не все поправили, но да ладно )

тут, наверное, нужен прямой "/"

@Артем_Ефимов, спасибо, исправил.

Тег now позволяет вывести системное время.

1) А он точно выводит именно системное время? Просто мое системное время не совпадает с тем что вывел соотв. тег)) Или я не на то системное время думаю (разница в секундах нормальная, просто прошло время после скрина)...




2) {% endif %} и {% endfor %}  - правильно ли понимаю, что данная конструкция после условия/цикла обязательна? 
Может стоит дополнить материал, дополнительно насколько понял еще есть {% elif %}?)

Изменен Нарбеков Марсель

@Нарбеков_Марсель, если часовой пояс правильно задан в настройках, то системное время, по умолчанию TIME_ZONE = 'UTC' .

Для московского времени необходимо установить часовой пояс TIME_ZONE = 'Europe/Moscow'.

Таблица часовых поясов https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

По тегам да, обязательно. Про тег {% elif %} добавим материал.

@Дмитрий_Селезнев, понял, спасибо!

Ничего себе html апгрейднулся, он там еще не полный по Тьюрингу часом?

Изменен Игорь Галимов

Привет!
Поясните плиз подробнее, как работает этот код?
Не совсем понятно, почему использованы именно такие отступы и почему тег 'empty' находится внутри цикла.

@Oleg_Lavrentev, Поправили отступы. Код работает следующим образом, идет итерация по циклу, и выводится значение цикла. В случае если объект cat пустой или не найден, то сработает код блок кода {% empy %} и будет выведен текст  "Категории пусты"

Большое спасибо👍🏻