Python

Шесть малоизвестных шаблонный тегов Django

Spread the love

Эта короткая статья предназначена тому, у кого нет времени читать документацию.

Оригинальная статья: highcenburgSix 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 %}
Была ли вам полезна эта статья?
[2 / 5]

Spread the love
Editorial Team

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

11 месяцев ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

11 месяцев ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

2 года ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

2 года ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

2 года ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

2 года ago