我正在寻找一种在 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 %}
当然这不起作用,因为 % 是保留字符。有没有其他方法可以做到这一点?
templatetag
标记,但它涵盖了 {%
、%}
等(不是 %
)。
您需要 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 %}
您不能在 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' '' '' '' %}">
引导行和列示例。每 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 %}
不定期副业成功案例分享