我正在尝试在Django模板中的forloop.counter
上执行多项数学运算。具体来说,我正在尝试找出第24个实例之后的第29个实例;因此第24、53、82、111、140个实例等等。
我尝试了以下操作但未成功:
{% if forloop.counter == 24 or widthratio forloop.counter|add:"-24" 29 1 %}
{% if forloop.counter == 24 or forloop.counter|add:"-24"|divisibleby:29 %}
有人对我有什么建议可以帮助我实现目标吗?任何帮助深表感谢!
答案 0 :(得分:0)
您可以这样写:
{% for element in collection %}
{% if forloop.counter|add:"-24"|divisibleby:"29" %}
...
{% endif %}
{% endfor %}
鉴于偏移量(此处24
)小于句点(此处29
),这将起作用,否则我们需要额外的条件(例如,使用31
和{{ 1}}):
29
例如:
{% for element in collection %}
{% if forloop.counter >= 31 forloop.counter|add:"-31"|divisibleby:"29" %}
...
{% endif %}
{% endfor %}
如您所见,对于条件成立的迭代,将打印>>> tp = '{% for element in collection %}{% if forloop.counter|add:"-24"|divisibleby:"29"%}A{% else %}B{% endif %}{% endfor %}'
>>> Template(tp).render(Context({'collection': range(100)}))
'BBBBBBBBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBBBBBBBBBBBBBABBBBBBBBBBBBBBBBBB'
。
但是,如果需要编写复杂的逻辑,通常应该重新考虑设计,并查看是否不能“将逻辑”移至视图。
答案 1 :(得分:0)
除Willem之外,另一个有趣的选择是首先编写一个模滤波器:
@register.filter
def modulo(num, val):
return num % val
然后在模板中使用过滤器:
{% if forloop.counter|modulo:29 0 %}
但是,通常,您可以并且应该在视图中而不是模板中执行此类操作。目前尚不清楚为什么要采用这种方式,所以您可能有自己的理由,但请尽量避免这样做。