web-dev-qa-db-fra.com

Module% dans le modèle Django

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?

108
underdoeg

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 %}
191
Burhan Khalid

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' '' '' '' %}">
13
mipadi

Il semble que vous devez simplement utiliser la balise cycle. balises de modèle intégrées

13
thatwasbrilliant

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.

myapp/templatetags/my_tags.py

from Django import template

register = template.Library()

@register.filter
def modulo(num, val):
    return num % val

modèle html

{% 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 %}
8
ab 16