Je cherche un moyen d'utiliser quelque chose comme l'opérateur de module dans Django. Ce que j'essaie de faire, c'est d'ajouter un nom de classe à chaque quatrième élément d'une boucle.
Avec le module, cela ressemblerait à ceci:
{% for p in posts %}
<div class="post width1 height2 column {% if forloop.counter0 % 4 == 0 %}first{% endif %}}">
<div class="preview">
</div>
<div class="overlay">
</div>
<h2>p.title</h2>
</div>
{% endfor %}
Bien sûr, cela ne fonctionne pas car% est un caractère réservé. Y a-t-un autre moyen de faire ça?
Vous avez besoin de divisibleby , un filtre intégré Django.
{% for p in posts %}
<div class="post width1 height2 column {% if forloop.counter0|divisibleby:4 %}first{% endif %}">
<div class="preview">
</div>
<div class="overlay">
</div>
<h2>p.title</h2>
</div>
{% endfor %}
Vous ne pouvez pas utiliser l'opérateur de module dans les balises de modèle Django, mais il serait assez facile d'écrire un filtre pour le faire. Quelque chose comme ça devrait fonctionner:
@register.filter
def modulo(num, val):
return num % val
Et alors:
{% ifequal forloop.counter0|modulo:4 0 %}
Vous pouvez même faire quelque chose comme ça à la place:
@register.filter
def modulo(num, val):
return num % val == 0
Et alors:
{% if forloop.counter0|modulo:4 %}
Ou vous pouvez utiliser la balise cycle
:
<div class="post width1 height2 column {% cycle 'first' '' '' '' %}">
Il semble que vous devez simplement utiliser la balise cycle. balises de modèle intégrées
Exemple de lignes et colonnes d'amorçage. Nouvelle ligne tous les 4 articles. Fermez également la dernière ligne même s'il y a moins de 4 éléments.
from Django import template
register = template.Library()
@register.filter
def modulo(num, val):
return num % val
{% load my_tags %}
{% for item in all_items %}
{% if forloop.counter|modulo:4 == 1 %}
<div class="row">
{% endif %}
<div class="col-sm-3">
{{ item }}
</div>
{% if forloop.last or forloop.counter|modulo:4 == 0 %}
</div>
{% endif %}
{% endfor %}