我正在寻找一种方法来使用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 %}
当然这不起作用,因为%是保留字符。还有其他办法吗?
答案 0 :(得分:189)
你需要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 :(得分:13)
你不能在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' '' '' '' %}">
答案 2 :(得分:13)
听起来你应该只使用循环标签。 Built-in template tags
答案 3 :(得分:7)
Bootstrap行和列示例。 每4个项目新增一行。即使少于4个项目也会关闭最后一行。
from django import template
register = template.Library()
@register.filter
def modulo(num, val):
return num % val
{% 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 %}