问题: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 %}
当然,这是行不通的,因为%是保留字符。还有其他方法吗?
回答 0
您需要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
您不能在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
听起来您应该只使用cycle标签。 内置模板标签
回答 3
引导行和列的示例。每4项新行。即使少于4个项目,也请关闭最后一行。
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 %}