Как использовать математические остатки в шаблоне Django?
-
08-07-2019 - |
Вопрос
Я хотел бы изменить атрибут класса li после каждых 4 элементов (это означает, что 5-й, 9-й, 13-й классы элементов li должны быть изменены).
Я пробовал что-то вроде ниже, но это дало мне синтаксическую ошибку: Не удалось проанализировать остаток: «% 4» из «forloop.counter% 4»
{% for p in plist %}
{% ifequal forloop.counter%4 1 %}
<li class="clear"> {{p.title}} </li>
{% else %}
<li> {{p.title}} </li>
{% endifequal %}
{% endfor %}
Я буду признателен, если кто-нибудь предложит мне рабочее решение.
Решение
Вы не можете делать такие оценки в шаблоне django. Тег ifequal ожидает только два параметра и сравнивает их. Вам понадобится какой-то тип фильтра.
Однако вместо этого вы можете использовать тег цикла:
{% for p in plist %}
{% if forloop.first %}
<li> {{p.title}} </li>
{% else %}
<li{% cycle '' '' '' ' class="clear"' %}> {{p.title}} </li>
{% endif %}
{% endfor %}
РЕДАКТИРОВАТЬ: Как указывалось, исходное решение очистило 4, 8 и т. д., а не с 5-го и далее. Я обновил ответ, включив в него изменения от Толги.
Другие советы
Вы можете использовать forloop.counter0 и фильтр divisibleby:
{% ifequal forloop.counter0|divisibleby:"4" %}
Логика может быть сложной, но divisibleby фильтр может помочь.
Вы не хотите делать это так - вот что цикл
для.
{% for p in plist %}
<li{% ifnotequal forloop.counter 1 %}{% cycle ' class="clear"' '' '' '' %}{% endifnotequal %}>{{p.title}</li>
{% endfor %}
Этот пример очищает 5, 9, 13 и т. д.
Изменить: шапка @cpharmston.
Я немного боролся с этим, пытаясь ограничить количество карт Bootstrap до 3 на колоду карт.
Это работает в Django 2.1 и выше, чтобы ограничить строку группами из 3:
{% ifequal forloop.counter|divisibleby:"3" True %}