Модуль% в шаблоне Django

121

Я ищу способ использовать что-то вроде оператора модуля в django. Я пытаюсь добавить имя класса к каждому четвертому элементу цикла.

По модулю это будет выглядеть так:

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

Конечно, это не работает, потому что% - зарезервированный символ. Есть ли другой способ сделать это?

underdoeg
источник
Вы хоть пробовали? Django предоставляет templatetagтег, но он охватывает {%, %}и т. Д. (Не %).
Platinum Azure
4
да, я пробовал, но получаю следующую ошибку: не удалось проанализировать остаток: «%» от «%». Я предполагаю, что это потому, что он не знает, как сократить модуль. Оператор также не указан в документации docs.djangoproject.com/en/dev/ref/templates/builtins/…
underdoeg

Ответы:

210

Вам нужен divisibleby , встроенный фильтр 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 %}
Бурхан Халид
источник
1
ах да, именно так. используя цикл сейчас, но можно использовать в будущем. Я бы не хотел использовать цикл с модулятором 100 или что-то в этом роде :) На самом деле я собираюсь отметить этот ответ как правильный. потому что он фокусируется на модуле, а не на обходном пути ...
underdoeg
15

Вы не можете использовать оператор модуля в тегах шаблонов Django, но было бы достаточно просто написать фильтр для этого. Примерно так должно работать:

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

А потом:

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

Вместо этого вы можете сделать что-то вроде этого:

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

А потом:

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

Или вы можете использовать cycleтег:

<div class="post width1 height2 column {% cycle 'first' '' '' '' %}">
mipadi
источник
13

Пример строк и столбцов начальной загрузки. Новый ряд каждые 4 шт. Также закройте последнюю строку, даже если элементов меньше 4.

MyApp / templatetags / my_tags.py

from django import template

register = template.Library()

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

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
источник
2
Это лучший ответ, потому что он описывает, какой каталог необходимо создать, а также описывает необходимость загрузки настраиваемого шаблона в html шаблона. Спасибо.
truthadjustr