Modul% in der Django-Vorlage

120

Ich suche nach einer Möglichkeit, so etwas wie den Moduloperator in Django zu verwenden. Ich versuche, jedem vierten Element in einer Schleife einen Klassennamen hinzuzufügen.

Mit Modul würde es so aussehen:

{% 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 %}

Dies funktioniert natürlich nicht, da% ein reserviertes Zeichen ist. Gibt es eine andere Möglichkeit, dies zu tun?

underdoeg
quelle
Hast du es überhaupt versucht? Django bietet den templatetagTag, aber das Cover {%, %}usw. (nicht %).
Platinum Azure
4
Ja, ich habe es versucht, aber ich erhalte die folgende Fehlermeldung: Der Rest konnte nicht analysiert werden: '%' von '%' Ich nehme an, es liegt daran, dass es nicht weiß, wie man den Modulor pariert. Der Operator ist auch nicht in den Dokumenten docs.djangoproject.com/de/dev/ref/templates/builtins/…
underdoeg

Antworten:

210

Sie benötigen divisibleby , einen eingebauten Django-Filter.

{% 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 %}
Burhan Khalid
quelle
1
ah ja, genau das ist es. Jetzt Zyklus verwenden, aber gut für zukünftige Referenz. Ich würde Cycle nicht mit Modulor 100 oder so verwenden wollen :) Eigentlich werde ich diese Antwort als die richtige markieren. weil es sich auf Modulor und nicht auf eine
Problemumgehung
15

Sie können den Moduloperator nicht in Django-Vorlagen-Tags verwenden, aber es wäre einfach genug, einen Filter dafür zu schreiben. So etwas sollte funktionieren:

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

Und dann:

{% ifequal forloop.counter0|modulo:4 0 %}

Sie könnten stattdessen sogar so etwas tun:

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

Und dann:

{% if forloop.counter0|modulo:4 %}

Oder Sie könnten das cycleTag verwenden:

<div class="post width1 height2 column {% cycle 'first' '' '' '' %}">
Mipadi
quelle
11

Beispiel für Bootstrap-Zeilen und -Spalten. Neue Zeile alle 4 Elemente. Schließen Sie auch die letzte Reihe, auch wenn weniger als 4 Elemente vorhanden sind.

myapp / templatetags / my_tags.py

from django import template

register = template.Library()

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

HTML-Vorlage

{% 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 %}
ab 16
quelle
2
Dies ist die bessere Antwort, da hier beschrieben wird, welches Verzeichnis erstellt werden muss, und es wird auch die Notwendigkeit beschrieben, die benutzerdefinierte Vorlage in die HTML-Vorlage zu laden. Danke dir.
Truthadjustr