Модуль% в шаблоне 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 %}
Конечно, это не работает, потому что% - зарезервированный символ. Есть ли другой способ сделать это?
Ответы
Ответ 1
Вам нужен 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 %}
Ответ 2
Вы не можете использовать оператор модуля в тегах шаблонов 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' '' '' '' %}">
Ответ 3
Похоже, вы должны просто использовать тег цикла.
Встроенные теги шаблонов
Ответ 4
Пример строк и столбцов начальной загрузки.
Новая строка каждые 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 %}