come usare il resto matematico nel modello django?
-
08-07-2019 - |
Domanda
Vorrei cambiare l'attributo class di un li dopo ogni 4 elementi (ciò significa che le classi di elementi li 5, 9, 13 dovrebbero essere cambiate).
Ho provato qualcosa come sotto ma mi ha dato un errore di sintassi: Impossibile analizzare il resto: '% 4' da '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 %}
Apprezzerò se qualcuno mi suggerirà una soluzione funzionante.
Soluzione
Non puoi fare valutazioni del genere nel modello django. Il tag ifequal prevede solo due parametri e li confronta. Avresti bisogno di un tipo di filtro.
Tuttavia, è possibile utilizzare invece il tag ciclo:
{% for p in plist %}
{% if forloop.first %}
<li> {{p.title}} </li>
{% else %}
<li{% cycle '' '' '' ' class="clear"' %}> {{p.title}} </li>
{% endif %}
{% endfor %}
MODIFICA: Come sottolineato, la soluzione originale ha eliminato il 4, l'8 °, ecc., anziché dal 5 in poi. Ho aggiornato la risposta per includere le modifiche di Tolga.
Altri suggerimenti
Puoi usare forloop.counter0 e filtrare divisibile per:
{% ifequal forloop.counter0|divisibleby:"4" %}
La logica sarebbe complessa, ma il divisibleby filtro potrebbe aiutare.
Non vuoi farlo in questo modo - ecco cosa ciclo
è per.
{% for p in plist %}
<li{% ifnotequal forloop.counter 1 %}{% cycle ' class="clear"' '' '' '' %}{% endifnotequal %}>{{p.title}</li>
{% endfor %}
Quell'esempio cancella il 5 °, 9 °, 13 ° ecc.
Modifica: hat tip @cpharmston.
Ho faticato per un po ', cercando di limitare le carte Bootstrap a 3 per mazzo di carte.
Funziona in Django 2.1 e versioni successive, per limitare una riga a gruppi di 3:
{% ifequal forloop.counter|divisibleby:"3" True %}