webentwicklung-frage-antwort-db.com.de

Modul% in Django template

Ich suche nach einer Möglichkeit, so etwas wie den Modul-Operator 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 %}

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

108
underdoeg

Sie benötigen teilbar durch , 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 %}
191
Burhan Khalid

Sie können den Modulus-Operator nicht in Django template-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 den Tag cycle verwenden:

<div class="post width1 height2 column {% cycle 'first' '' '' '' %}">
13
mipadi

Es hört sich so an, als ob Sie nur das Cycle-Tag verwenden sollten. Integrierte Vorlagen-Tags

13

Beispiel für Bootstrap-Zeilen und -Spalten. Neue Reihe alle 4 Artikel. Schließen Sie auch die letzte Reihe, 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 %}
8
ab 16