【问题标题】:Advanced Django Template Logic高级 Django 模板逻辑
【发布时间】:2013-07-25 20:49:49
【问题描述】:

我不确定这是否真的很容易,我只是在文档中浏览了一下,或者这是否是 Django 模板系统的限制,但我需要能够做一点(不是很)高级Django中的逻辑,我宁愿不必重复自己。

假设我有 3 个布尔值; A、B 和 C。

我基本上需要做的:

{% if A and (B or C) %}
    {{ do stuff }}
{% endif %}

但是 Django 似乎不允许使用括号对 (B or C) 逻辑进行分组。有没有办法在 Django 的模板语言中进行这种分组?或者我是否需要做非 DRY 版本,即:

  {% if A and B %}
        {{ do stuff }}
  {% else %}
      {% if A and C %}
          {{ do the same stuff }}
      {% endif %}
  {% endif %}

【问题讨论】:

    标签: django templates django-templates boolean logic


    【解决方案1】:

    docs for the if template tag 说:

    在 if 标记中使用实际括号是无效的语法。如果你需要它们来表示优先级,你应该使用嵌套的 if 标签。

    这是用嵌套标签表达逻辑的更简洁的方式:

    {% if A %}
      {% if B or C %}
        {{ do stuff }}
      {% endif %}
    {% endif %}
    

    【讨论】:

    • 啊。我知道了。这比我写的要干净得多,即使它不像能够使用括号那么简单,至少它是相当干的。谢谢!
    • 如何在不复制的情况下添加else 分支?
    • @JoachimBreitner - 一种方法是否定条件,使用身份~(A & B) == ~A | ~B~(A | B) == ~A & ~B。所以{% if not A or not B and not C %} else branch here {% else %}{{ do stuff }}{% endif %}。这会将表达式转换为 notandor 运算符的非括号优先级给出所需逻辑的表达式。
    • @djangodevs(回复:@PeterDeGlopper's):tldr:你应该允许括号,因为彼得刚刚解释的事情很荒谬
    • @JanKyuPeblik imo 将逻辑从模板上推到视图或模型代码是一个好主意。这样更干净。我不知道,但不会感到惊讶,发现 Django 开发人员通过设计限制了模板逻辑功能。例如对于这个问题:,在视图中:context['do_my_stuff'] = A and (B or C),在模板中:{% if do_my_stuff %} ... {% endif %}
    【解决方案2】:

    将括号内的任何内容分配给变量。

    {% with B or C as D %}
      {% if A and D %}
        {{ do stuff }}
      {% endif %}
    {% endwith %}
    

    PS:这不适用于较新的版本。

    【讨论】:

    • @OlegTikhonov 不确定。现在不使用 Django。但是,我希望只要存在标签,它就必须有效。
    • 不正确,django 模板语言只允许在 with 语句中有一个值,没有任何逻辑
    • 感谢您指出@OlegTikhonov,观察到它在较新版本中不起作用。刚刚在 1.11 上尝试过
    【解决方案3】:

    或者,您可以“扩展”括号的内容并将其计算为:

    {% if A and B or A and C %}
        {{ do stuff }}
    {% endif %}
    

    【讨论】:

    • 这可能会变得混乱,因为它的优先级超过 or 语句,并且可能导致不希望的结果。
    • @BrankoRadojevic 没错,如果逻辑很复杂,最好在视图中签入,不要让模板逻辑混乱。
    猜你喜欢
    • 2012-02-27
    • 2018-12-30
    • 2014-03-07
    • 2019-10-06
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多