Как использовать математические остатки в шаблоне Django?

StackOverflow https://stackoverflow.com/questions/1438486

  •  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 %}   
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top