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

当然,这是不可行的,因为% 是一个保留字符。还有其他方法可以做到这一点吗?

49532 次浏览

您不能在 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' '' '' '' %}">

听起来你应该直接用循环标签。 内置的模板标记

你需要 不可分割,一个内置的 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 %}

引导行和列示例。 每4个项目新建一行。即使少于4个项目也要关闭最后一行。

Myapp/templatetags/my _ tag. 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 %}