Модуль% у шаблоні Джанго


120

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

Звичайно, це не працює, оскільки% є зарезервованим символом. Чи є якийсь інший спосіб зробити це?


Ви навіть пробували це? Django надає templatetagтег, але обкладинки {%, %}і т.д. (Не %).
Platinum Azure

4
так, я спробував це, але я отримую таку помилку: Не вдалося проаналізувати залишок: '%' від '%'. Я припускаю, що це так, тому що він не знає, як спарувати модуль. Оператор також не вказаний у docs.djangoproject.com/en/dev/ref/templates/builtins/…
underdoeg

Відповіді:


210

Вам потрібен ділили , вбудований фільтр джанго.

{% 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
ах так, саме так. використовуючи цикл зараз, але добре для подальшого використання. Я не хотів би використовувати цикл з modulor 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' '' '' '' %}">


12

Приклад рядків і стовпців для завантаження. Новий рядок кожні 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 %}

2
Це краща відповідь, оскільки він описує необхідний каталог для створення, а також описує необхідність завантаження користувальницького шаблону в HTML-шаблон. Дякую.
truthadjustr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.