【问题标题】:django template forloop.counter multiple operationsdjango模板forloop.counter多个操作
【发布时间】:2019-02-26 06:29:20
【问题描述】:

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

有没有人有任何建议可以帮助我实现目标?非常感谢任何帮助!

【问题讨论】:

  • "我正在尝试对我的 Django 模板中的 forloop.counter 执行多个数学运算。" 不要那样做 (!)。 Django 模板语言被故意限制以避免在模板中做复杂的事情。这样的逻辑属于view
  • 目的是对表格中的这些行应用不同的 CSS 格式。可以通过视图实现吗?
  • 当然,您可以zip 迭代中的条件,然后在模板中使用if 来检查该数据。由于 Python 是“图灵完备的”,这意味着您可以在模板中执行的所有操作,都可以在视图中执行。
  • 这不是图灵完备性的真正定义@WillemVanOnsem
  • @ubadub:不,这是图灵完备性的逻辑结果:)否则它不会以“Since”开头。关键是 Python 在概念上是图灵完备的,因此除非存在 Oracle 机器,否则这意味着您无法使用另一个无法用视图生成的图灵完备(并且功能更强大)的设备生成任何内容流。所以结果是,由于模板至多是图灵完备的,它不能产生视图不能产生的流。

标签: django for-loop django-templates


【解决方案1】:

你可以这样写:

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

假设偏移量(此处为24)小于句点(此处为29),这将起作用,否则我们需要一个额外的条件(例如3129):

{% 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

但如果你需要编写复杂的逻辑,一般你应该重新考虑设计,看看你是否不能将逻辑“移动”到视图中。

【讨论】:

  • 感谢 Willem,非常感谢您的解释和解决方案!
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 2012-07-04
    • 2010-11-16
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2022-08-07
    • 2019-04-16
    • 2011-01-30
    相关资源
    最近更新 更多