#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. Я только что увидел ваше отредактированное решение. Я уверен, что это также обеспечит тот же требуемый результат.