【问题标题】:Django Template Ternary OperatorDjango 模板三元运算符
【发布时间】:2011-03-07 19:30:54
【问题描述】:

我想知道是否有可以在 Django 模板中使用的三元运算符(条件?真值:假值)。我看到有一个 python (如果条件为真值,否则为假值),但我不确定如何在 Django 模板中使用它来显示由其中一个值给出的 html。有什么想法吗?

【问题讨论】:

    标签: python django templates ternary-operator


    【解决方案1】:

    您可以使用 yesno 过滤器:

    {{ value|yesno:"yeah,no,maybe" }}
    

    您可以了解更多here

    【讨论】:

    • 太棒了。谢谢你的回答。我知道这存在,但不记得了。
    • 非常好和简单,但是当我想使用一些变量时,这个过滤器似乎不适用。例如我想使用{{ expr_or_value | yesno : "the string", other_variable_value }}
    • 这应该是选择的答案!这正是所要求的。
    【解决方案2】:

    只是因为这里还没有提到它们:内置模板标签defaultdefault_if_none 在简单的情况下很有用:

    默认

    如果 value 的计算结果为 False,则使用给定的默认值。否则,使用该值。

    例如:

    {{ value|default:"nothing" }}

    如果值为“”(空字符串),则输出为空。

    default_if_none

    如果(且仅当)值为无,则使用给定的默认值。否则,使用 >value。

    请注意,如果给定一个空字符串,则不会使用默认值。如果您想回退空字符串,请使用 >默认过滤器。

    例如:

    {{ value|default_if_none:"nothing" }}

    如果值为 None,则输出将是字符串“nothing”。

    https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#default

    【讨论】:

    【解决方案3】:

    我刚刚将 Django 的三元运算符实现为标签,请参阅https://github.com/alexei/django-template-extensions 您可以将其用作:

    {% ?: exp1 exp2 exp3 %}
    {% ?: exp1 exp2 %}
    

    或者:

    {% iif exp1 exp2 exp3 %}
    {% iif exp1 exp2 %}
    

    我发现它比 yesno 过滤器更有意义,即使它真的不是 Pythonic。

    【讨论】:

    • 太棒了,谢谢!解决了我无法将上下文变量传递给|yesno的问题
    【解决方案4】:

    我想知道 python 和/或技巧是否有效?

    condition and true_value or false_value
    

    行为类似于三元运算符 - 如果条件计算结果为 True,则输出 true_value,否则输出 false_value。

    【讨论】:

    • 我最近了解到true_value if condition else false_value 也是有效的 Python 语法,而且它更具可读性——将检查它是否适用于模板...
    • 这是我尝试的第一件事;我很惊讶它不起作用。
    【解决方案5】:

    你没有。 Django {% if %} 模板标签才刚刚开始支持==and 等。{% if cond %}{% else %}{% endif %} 目前已经很紧凑了。

    【讨论】:

      【解决方案6】:

      为什么需要在模板中使用三元运算符? {% if %}{% else %} 是你所需要的。

      或者你可以试试firstof标签:

      {% firstof var1 var2 var3 %}
      

      它输出 var1、var2 或 var3 中的第一个,其计算结果为 True 值。

      【讨论】:

      • 我想你是对的,我只使用 if/else。我猜只是沉迷于三元。
      • 我也希望看到三元支持。
      • 我倾向于不同意丹尼尔的观点。我最近将一个 django 模板转换为一个简单的 javascript 模板:{% if data_complete %}{{ data }}{% else %}{{ something_else }}{% endif %} 变成了<%= data_complete ? data : something_else %> ...第二个更加紧凑和优雅。如果 django 中有一个等价物就好了。
      • "why would you" ...好吧,例如,在 30 秒而不是 1000 万秒内做某事。 Django 模板对开发人员不太友好,必须在视图中而不是模板中做事并不总是一件好事。