Модуль % в шаблоне Django
Я ищу способ использовать что-то вроде оператора модуля в django. То, что я пытаюсь сделать, это добавить имя класса к каждому четвертому элементу в цикле.
с модулем это будет выглядеть так:
{% for p in posts %}
<div class="post width1 height2 column {% if forloop.counter0 % 4 == 0 %}first{% endif %}}">
<div class="preview">
</div>
<div class="overlay">
</div>
<h2>p.title</h2>
</div>
{% endfor %}
конечно, это не работает, потому что % - это зарезервированный символ. Есть ли другой способ сделать это?
4 ответа:
вам нужно divisibleby, встроенный фильтр django.
{% for p in posts %} <div class="post width1 height2 column {% if forloop.counter0|divisibleby:4 %}first{% endif %}"> <div class="preview"> </div> <div class="overlay"> </div> <h2>p.title</h2> </div> {% endfor %}
вы не можете использовать оператор модуля в тегах шаблона Django, но для этого было бы достаточно легко написать фильтр. Что-то вроде этого должно работать:
@register.filter def modulo(num, val): return num % val
и затем:
{% ifequal forloop.counter0|modulo:4 0 %}
вы могли бы даже сделать что-то вроде этого, вместо этого:
@register.filter def modulo(num, val): return num % val == 0
и затем:
{% if forloop.counter0|modulo:4 %}
или вы могли бы использовать
cycle
теги:<div class="post width1 height2 column {% cycle 'first' '' '' '' %}">
похоже, что вы должны просто использовать тег цикла. встроенные теги шаблонов
пример начальной загрузки строк и столбцов. Новая строка каждые 4 элемента. Также закройте последнюю строку, даже если есть менее 4 элементов.
myapp/templatetags/my_tags.py
from django import template register = template.Library() @register.filter def modulo(num, val): return num % val
html шаблон
{% load my_tags %} {% for item in all_items %} {% if forloop.counter|modulo:4 == 1 %} <div class="row"> {% endif %} <div class="col-sm-3"> {{ item }} </div> {% if forloop.last or forloop.counter|modulo:4 == 0 %} </div> {% endif %} {% endfor %}