Шесть малоизвестных шаблонный тегов 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 %}

Spread the love

Добавить комментарий

Ваш e-mail не будет опубликован.