Moduł% w szablonie Django

121

Szukam sposobu na użycie czegoś takiego jak operator modułu w django. To, co próbuję zrobić, to dodać nazwę klasy do co czwartego elementu w pętli.

Z modułem wyglądałoby to tak:

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

Oczywiście to nie działa, ponieważ% to zastrzeżony znak. Czy jest inny sposób, aby to zrobić?

underdoeg
źródło
Czy w ogóle tego próbowałeś? Django dostarcza templatetagznacznik, ale okładki {%, %}itp (nie %).
Platinum Azure
4
tak, próbowałem, ale pojawia się następujący błąd: Nie można przeanalizować pozostałej części: „%” z „%” Zakładam, że dzieje się tak, ponieważ nie wie, jak dopasować moduł. Operator nie jest również wymieniony w docs docs.djangoproject.com/en/dev/ref/templates/builtins/ ...
underdoeg

Odpowiedzi:

210

Potrzebujesz divisibleby , wbudowanego filtru 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 %}
Burhan Khalid
źródło
1
Ach tak, to jest dokładnie to. używam cyklu teraz, ale nadaje się do wykorzystania w przyszłości. Nie chciałbym używać cyklu z modułem 100 lub czymś podobnym :) Właściwie to zamierzam zaznaczyć tę odpowiedź jako właściwą. ponieważ skupia się na module, a nie na
obejściu
15

Nie możesz użyć operatora modulus w tagach szablonu Django, ale wystarczyłoby napisać filtr, aby to zrobić. Coś takiego powinno działać:

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

I wtedy:

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

Zamiast tego możesz nawet zrobić coś takiego:

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

I wtedy:

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

Lub możesz użyć cycletagu:

<div class="post width1 height2 column {% cycle 'first' '' '' '' %}">
mipadi
źródło
12

Przykład ładowania wierszy i kolumn. Nowy rząd co 4 pozycje. Zamknij również ostatni wiersz, nawet jeśli jest mniej niż 4 elementy.

myapp / templatetags / my_tags.py

from django import template

register = template.Library()

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

szablon 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 %}
ab 16
źródło
2
To jest lepsza odpowiedź, ponieważ opisuje, jaki potrzebny katalog ma zostać utworzony, a także opisuje potrzebę załadowania niestandardowego szablonu w szablonie html. Dziękuję Ci.
trueadjustr