在Jinja2中,如何测试变量是否未定义?

290

从 Django 转换过来,我通常会这样做:

{% if not var1 %} {% endif %}

如果我没有将var1放入上下文中,要让它起作用。Jinja2会给我一个未定义的错误。有没有一种简单的方法来表示{% if var1 == None %}或类似的内容?

9个回答

493

以下内容来自 Jinja2 模板设计文档:

{% if variable is defined %}
    value of variable: {{ variable }}
{% else %}
    variable is not defined
{% endif %}

1
我相信这是正确的,但我的搜索词通常不能反映出来。 - dannyman
41
此外,你可以使用 {% if variable is not defined %} 来测试相反的情况。 - pbaranay
1
@dannyman 自0.2.0版本以来 - Samuel Harmer
13
如果变量已定义且非空,{% if variable is defined and variable %} 将会检查是否为空。 - Vivek
1
@Vivek,你的答案是最好的。通常我会给我的变量空值test: ~,而你的解决方案可以识别它。谢谢 :) - Khaled

57

{% if variable is defined %} 是当变量为 None 时为真。

由于不允许使用 not is None,这意味着

{% if variable != None %}

是你唯一的选择。


1
如果variable在不为None时总是被评估为True,则{% if variable != None %}等同于{% if variable %} - azalea
7
如果您想检查是否为None,请使用小写的none,示例代码为:{% if variable is not none %} - Felipe Alvarez
2
@FelipeAlvarez,你有这方面的文档链接吗?提前感谢。 - ryanwebjackson
3
这是一个名为none内置测试 - kennysong

22

你也可以在jinja2模板中这样定义变量:

{% if step is not defined %}
{% set step = 1 %}
{% endif %}

然后你可以像这样使用它:

{% if step == 1 %}
<div class="col-xs-3 bs-wizard-step active">
{% elif step > 1 %}
<div class="col-xs-3 bs-wizard-step complete">
{% else %}
<div class="col-xs-3 bs-wizard-step disabled">
{% endif %}

否则(如果您不使用{% set step = 1 %}),上面的代码就会抛出异常:

否则(如果您不使用{% set step = 1 %}),上面的代码将会报错:

(Two possible translations depending on context)
UndefinedError: 'step' is undefined

12
在环境设置中,我们使用了undefined = StrictUndefined,这会防止未定义的值被设置为任何值。问题已通过以下方式得到解决:
from jinja2 import Undefined
JINJA2_ENVIRONMENT_OPTIONS = { 'undefined' : Undefined }

10

您可以使用一种名为Jinja的Elvis运算符

{{ 'OK' if variable is defined else 'N/A' }}

或者另外检查是否为空

{{ 'OK' if (variable is defined and variable) else 'N/A' }}

Jinja模板 - 模板设计师文档

IF表达式


8
考虑使用默认过滤器,如果这正是您所需要的。例如:
{% set host = jabber.host | default(default.host) -%}

或者使用更多的回退值,并在最后添加一个“硬编码”的值,例如:
{% set connectTimeout = config.stackowerflow.connect.timeout | default(config.stackowerflow.timeout) | default(config.timeout) | default(42) -%}

1

我在Ansible中遇到了类似的问题。最终不得不对@Garret和@Carsten / @azalea的答案都进行测试,因此:

{% if variable is defined and variable %}
    value of variable: {{ variable }}
{% else %}
    variable is not defined or is falsy
{% endif %}

1

{% if variable is defined %} 用于检查某个变量是否未定义。

如果将变量默认为False,则可以使用{% if not var1 %}

class MainHandler(BaseHandler):
    def get(self):
        var1 = self.request.get('var1', False)

-4
你可以这样做:
- debug: 
    msg: "Executed only if variable is defined"
  when:
    - variable is defined

欢迎来到SO,如果您提供每行代码的更多上下文和原因,对于阅读您的答案的任何人都会很有帮助。 - GoodJuJu
1
这是针对Ansible的;与Jinja毫无关系。 - bfontaine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接