Django模板中的模数%


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标记,但覆盖{%%}等等(不%)。
白金Azure

4
是的,我尝试过,但是出现以下错误:无法解析余数:'%'from'%'我认为是因为它不知道如何解析调制器。该文档docs.djangoproject.com/en/dev/ref/templates/builtins/…
underdoeg 2011年

Answers:


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的调制器:)实际上,我很想将此答案标记为正确的答案。因为它专注于
模数

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中加载自定义模板的需求。谢谢。
trueadjustr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.