代码之家  ›  专栏  ›  技术社区  ›  cr1

django模板forloop.counter多个操作

  •  1
  • cr1  · 技术社区  · 6 年前

    forloop.counter 在我的Django模板中。具体地说,我试图找出每一个29次,在24次之后;所以第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 回复  |  直到 6 年前
        1
  •  1
  •   willeM_ Van Onsem    6 年前

    你可以这样写:

    {% for element in collection %}
      {% if forloop.counter|add:"-24"|divisibleby:"29" %}
        ...
      {% endif %}
    {% endfor %}

    给定偏移量(此处 24 )小于周期(此处 29 ),这将起作用,否则我们需要一个额外的条件(例如 31 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'
    

    如您所见,对于条件保持不变的迭代 A

    但是如果你需要写复杂的逻辑,一般来说你应该重新考虑设计,看看你是否可以把逻辑移到视图中。

        2
  •  0
  •   ubadub    6 年前

    除了Willem的,另一个有趣的选择是首先编写一个模滤波器:

    @register.filter
    def modulo(num, val):
        return num % val
    

    然后在模板中使用过滤器:

    {% if forloop.counter|modulo:29 0 %}
    

    不过,一般来说,您可以而且应该在视图中执行此类操作,而不是在模板中。不清楚你为什么要这样做,所以你可能有自己的理由,但如果可以的话尽量避免。