【问题标题】:Check if key exists in a Python dict in Jinja2 templates检查 Jinja2 模板中的 Python 字典中是否存在密钥
【发布时间】:2015-01-02 09:45:48
【问题描述】:

我有一本 python 字典:

settings = {
   "foo" : "baz",
   "hello" : "world"
}

这个变量 settings 然后在 Jinja2 模板中可用。

我想检查我的模板中的 settings 字典中是否存在键 myProperty,如果存在,请采取一些措施:

{% if settings.hasKey(myProperty) %}
   takeSomeAction();
{% endif %}

我可以使用的 hasKey 等价物是什么?

【问题讨论】:

  • 检查一下:如果 settings[myproperty] 不是 None:我认为这应该可行。
  • 或者如果 settings.myproperty 被定义:

标签: python django jinja2


【解决方案1】:

就像 Mihai 和 karelv 指出的那样,这很有效:

{% if 'blabla' in item %}
  ...
{% endif %}

如果我使用{% if item.blabla %} 并且item 不包含blabla 密钥,我会得到'dict object' has no attribute 'blabla'

【讨论】:

  • 对我来说也一样。在我的特殊情况下,我在 Ansible 中使用 Jinja2。
  • 在 Ansible 中使用 jinja2。没有什么帮助。 {% if 'blabla' in item %}{% if item.blabla %} 返回相同的 'dict object' has no attribute 'blabla' wtf???
  • argument of type 'StringField' is not iterable。不适合我
【解决方案2】:

您可以通过这种方式测试键定义:

{% if settings.property is defined %}

#...
{% endif %}

【讨论】:

  • 这看起来像是检查 dict 中是否存在密钥的正确方法。 +1
  • 您的答案检查对象属性,而不是字典键。
【解决方案3】:

工作正常在涉及字典的情况下不起作用。在这些情况下,请参阅 tshalif 的答案。 否则,使用 SaltStack(例如),您将收到此错误:

Unable to manage file: Jinja variable 'dict object' has no attribute '[attributeName]'

如果你使用这种方法:

{% if settings.myProperty %}

注意
如果settings.myProperty 存在,但被评估为False(例如settings.myProperty = 0),也会跳过。

【讨论】:

  • myProperty 可以是上述方法中的变量吗?
  • 是的,字典中的一个键。相当于hasKey。顺便说一句, hasKey 已被弃用。请改用in
  • 当 setting.myProperty 存在,但它等于零(整数 0)或布尔值 False,如果测试不是“hasKey”。这意味着您需要:{% if 'myProperty' in settings %}
  • 这对我不起作用(至少与 ansible 一起工作)。我发现我需要{% if settings.myProperty is defined %}
  • 我不明白为什么这被接受为答案 - 如果 dict 缺少密钥,它会引发错误。请更正答案。
【解决方案4】:

其实按照 Python 的风格,如果你做一个简单的 if 语句,它就可以工作:

{% if settings.foo %}
Setting Foo: {{ settings.foo }}
{% endif %}
{% if settings.bar %}
Setting Bar: {{ settings.bar }}
{% endif %}
{% if settings.hello %}
Setting Hello: {{ settings.hello }}
{% endif %}

输出:

Setting Foo: baz
Setting Hello: world

干杯!

【讨论】:

    猜你喜欢
    • 2016-01-28
    • 2019-02-13
    • 2011-04-20
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多