django模板forloop.counter多个操作

时间:2018-09-21 20:19:37

标签: django for-loop django-templates

我正在尝试在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 %}

有人对我有什么建议可以帮助我实现目标吗?任何帮助深表感谢!

2 个答案:

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

但是,通常,您可以并且应该在视图中而不是模板中执行此类操作。目前尚不清楚为什么要采用这种方式,所以您可能有自己的理由,但请尽量避免这样做。