Django 模板中的求余 %

143 投票
4 回答
53702 浏览
提问于 2025-04-17 08:19

我想在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 个回答

18

在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' '' '' '' %}">
19

这是一个关于Bootstrap的行和列的例子。每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 %}
256

你需要用到 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 %}

撰写回答