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

#django #django-templates

#django #django-шаблоны

Вопрос:

Я хотел бы изменить атрибут класса 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 %}
  

Я буду признателен, если кто-нибудь предложит мне рабочее решение.

Ответ №1:

Вы можете использовать forloop.counter0 и фильтровать divisibleby:

 {% ifequal forloop.counter0|divisibleby:"4" %}
  

Ответ №2:

Вы не можете выполнять подобные вычисления в шаблоне django. Тег ifequal ожидает только два параметра и сравнивает их. Вам понадобится какой-нибудь тип фильтра.

Однако вместо этого вы могли бы использовать тег cycle:

 {% for p in plist %} 
    {% if forloop.first %} 
        <li> {{p.title}} </li>
    {% else %}
        <li{% cycle '' '' '' ' class="clear"' %}> {{p.title}} </li> 
    {% endif %}
{% endfor %}
  

РЕДАКТИРОВАТЬ: Как указывалось, исходное решение очистило 4, 8 и т.д., а не начиная с 5-го. Я обновил ответ, включив изменения, внесенные Tolga.

Комментарии:

1. Это очищает 4-й, 8-й, 12-й … а не 5-й, 9-й, 13-й.

2. Я изменил предложенное вами решение, которое сработало так, как мне было нужно. {% для p в списке %} {% if forloop.first %} <li> {{p.title}} </li> {% else %} <li{% cycle » » » ‘ class=»clear»‘ %}> {{p.title}} </li> {% endif %} {% endfor %} Это очистит 5-й, 9-й и так далее.. Спасибо всем вам за ваши ценные ответы и комментарии.

3. Спасибо, Толга, я обновил ответ с помощью модификации.

Ответ №3:

Я немного боролся с этим, пытаясь ограничить количество загрузочных карт до 3 на колоду карт.

Это работает в Django 2.1 и выше, чтобы ограничить строку группами по 3:

 {% ifequal forloop.counter|divisibleby:"3" True %}   
  

Ответ №4:

Логика была бы сложной, но мог бы помочь фильтр divisibleby.

Комментарии:

1. С этим трюк был бы выполним, но, как вы заявляете, сложность была бы такова, что, вероятно, лучше убрать его из представления. Добавление простого атрибута намного удобочитаемо и должно доставлять намного меньше головной боли.

2. Я пробовал divisibleby, к сожалению, это не дает нужного мне результата. С помощью divisibleby; Я могу изменить атрибут для 4-го, 8-го, а не для 5-го, 9-го..

3. Таким образом, вы также можете использовать add фильтр: {% ifequal forloop.counter|add:"-1"|divisibleby:4 %} Ужасно, но делает то, что вы хотите.

Ответ №5:

Вы не хотите делать это таким образом — для этого cycle и существует.

 {% for p in plist %}
        <li{% ifnotequal forloop.counter 1 %}{% cycle ' class="clear"' '' '' '' %}{% endifnotequal %}>{{p.title}</li>
{% endfor %}
  

Этот пример очищает 5-й, 9-й, 13-й и т.д.

Редактировать: подсказка по шляпе @cpharmston.

Комментарии:

1. Как насчет {% ifnotequal forloop.counter 1 %}{% cycle » » » ‘ class=»clear»‘ %}{% endifnotequal %}?

2. Я только что увидел ваше отредактированное решение. Я уверен, что это также обеспечит тот же требуемый результат.