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


Я ищу способ использовать что-то вроде оператора модуля в 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 %}

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

4 95

4 ответа:

вам нужно 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 %}

вы не можете использовать оператор модуля в тегах шаблона 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' '' '' '' %}">

похоже, что вы должны просто использовать тег цикла. встроенные теги шаблонов

пример начальной загрузки строк и столбцов. Новая строка каждые 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 %}