¿Cómo usar el resto matemático en la plantilla django?
-
08-07-2019 - |
Pregunta
Me gustaría cambiar el atributo de clase de un li después de cada 4 elementos (eso significa que las clases de elementos 5º, 9º, 13º deberían cambiarse).
He intentado algo como a continuación, pero me dio un error de sintaxis: No se pudo analizar el resto: '% 4' de '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 %}
Apreciaré si alguien me sugiere una solución de trabajo.
Solución
No puede hacer evaluaciones como esa en la plantilla django. La etiqueta ifequal espera solo dos parámetros y los compara. Necesitarías algún tipo de filtro.
Sin embargo, podría usar la etiqueta de ciclo en su lugar:
{% for p in plist %}
{% if forloop.first %}
<li> {{p.title}} </li>
{% else %}
<li{% cycle '' '' '' ' class="clear"' %}> {{p.title}} </li>
{% endif %}
{% endfor %}
EDITAR: Como se señaló, la solución original borró el 4, 8, etc., en lugar de desde el 5 en adelante. He actualizado la respuesta para incluir los cambios de Tolga.
Otros consejos
Puede usar forloop.counter0 y filter divisibleby:
{% ifequal forloop.counter0|divisibleby:"4" %}
La lógica sería compleja, pero divisibleby filtro podría ayudar.
No quiere hacerlo así, eso es lo que cycle
es para.
{% for p in plist %}
<li{% ifnotequal forloop.counter 1 %}{% cycle ' class="clear"' '' '' '' %}{% endifnotequal %}>{{p.title}</li>
{% endfor %}
Ese ejemplo borra los días 5, 9, 13, etc.
Editar: hat tip @cpharmston.
Luché un poco con esto, tratando de limitar las cartas Bootstrap a 3 por mazo de cartas.
Esto funciona en Django 2.1 y superior, para limitar una fila a grupos de 3:
{% ifequal forloop.counter|divisibleby:"3" True %}