Шесть малоизвестных шаблонный тегов Django
Эта короткая статья предназначена тому, у кого нет времени читать документацию.
Оригинальная статья: highcenburg — Six Django template tags not often used in tutorials
Во время моего первого дня стажировки пару месяцев назад мне было поручено поработать над проектом компании, в котором использовалось большое количество разнообразных шаблонных тегов и у меня появилась хорошая возможность исследовать их всех. Далее я опишу некоторые из них, которые редко встречаются в учебных пособиях.
1.) for…empty
— Тег for может принимать необязательный атрибут {% empty %}, значение которого будет отображается, если данный массив пуст или не может быть найден:
{% for student in student_list %} … {% empty %} … {% endfor %}
Что также эквивалентно:
{% if student_list %} {% for student in student_list %} … {% endfor %} {% else %} … {% endif %}
2.) lorem
— Как оказывается, нам не нужны никакие другие пакеты или ручное копирование текста lorem. Этот тег отображает случайный латинский текст «lorem ipsum». Что очень полезно для предоставления образцов данных в шаблонах.
Синтаксис
{% lorem [count] [method] [random] %}
Результат
- {% lorem %} отобразить обычный параграф “lorem ipsum”. - {% lorem 3 p %} отобразить обычный параграф “lorem ipsum” и два случайных параграфа завернутые в теги HTML <p>. - {% lorem 2 w random %} отобразит два случайных латинских слова.
3.) now
— Отображает текущую дату и/или время, используя формат в соответствии с заданной строкой. Такая строка может содержать символы спецификаторов формата, как описано в разделе фильтра даты.
{% now “jS F Y” %}
4.) resetcycle
— Сбрасывает последнее cycle (шаблонная переменная в цикле), чтобы она указывала на первый элемент при следующем прохождение. Без аргументов {% resetcycle %} сбросит последний {% cycle %}, определенный в шаблоне.
{% for coach in coach_list %} {{ coach.name }} {% 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 %}
В этом примере у нас есть как чередующиеся нечетные/четные (odd/even) строки, так и «основная» (major) строка в каждой пятой строке. Только пятирядный цикл сбрасывается при изменении категории.
5.) verbatim
— Останавливает механизм рендеринга шаблонов содержимого этого тега блока.
— Обычно используется для того, чтобы разрешить слой шаблонов JavaScript, который вступает в противоречие с синтаксисом Django. (Например при использование в шаблона синтаксиса JS фреймворка который конфликтует с синтаксисов шаблонов Django)
Например:
{% verbatim %} {{ if dying }} Still alive. {{ /if }} {% endverbatim %}
— Вы также можете назначить определенный закрывающий тег, чтобы {% endverbatim %} не было бы частью обрабатываемого содержимого:
{% verbatim myblock %} Avoid template rendering via the {% verbatim %}{% endverbatim %} block. {% endverbatim myblock %}
6.) widthratio
— Для создания гистограмм и т. п. Этот тег вычисляет отношение заданного значения к максимальному значению, а затем применяет это отношение к константе.
<img src=”#” alt=”Imagine an image here” height=”10" width=”{% widthratio this_value max_value max_width %}”>
Если this_value равно 175, max_value равно 200, а max_width равно 100, изображение в вышеприведенном примере будет иметь ширину 88 пикселей (потому что 175/200 = .875; .875 * 100 = 87,5, что округлено до 88).
— В некоторых случаях вы можете захотеть зафиксировать результат widthratio в переменной. Это может быть полезно, например, в blocktrans:
{% widthratio this_value max_value max_width as width %} {% blocktrans % }The width is: {{ width }}{% endblocktrans %}