【问题标题】:How to add a new entry into a dictionary object while using jinja2?使用 jinja2 时如何将新条目添加到字典对象中?
【发布时间】:2016-08-21 13:32:03
【问题描述】:

在使用 jinja2 模板时,我无法将新条目追加到字典对象中。

例如,这里我使用 jinja2 模板,我创建了一个 data 变量,它是一个字典。在检查了一些 if 条件后,我 想要 将 location 属性附加到数据对象,例如

{%- set data = {
                  'name' : node.Name,
                  'id' : node.id,
               }
-%}

{% if node.location !="" %}
    data.append({'location': node.location}) 
{% endif %}

但是我找不到实现此目的的方法,并且收到了 UndefinedError:

jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'append'

有没有人遇到过这个问题或者可以提供参考来解决这个问题?

我在网上搜索但找不到解决方案,即如何实现在 Jinja 中向 dict 对象添加条目。

我参考了以下和其他网络资源:

  1. http://cewing.github.io/training.codefellows/assignments/day22/jinja2_walkthrough.html
  2. In Jinja2 whats the easiest way to set all the keys to be the values of a dictionary?
  3. https://github.com/saltstack/salt/issues/27494

【问题讨论】:

  • 请选择一个有帮助的答案,并用复选标记接受它,以便其他用途可以看到,哪个答案解决了问题。

标签: python dictionary jinja2


【解决方案1】:

没有do 扩展:

{%- set _ = dict.update({c.name: c}) -%}

在 Python 3 的基础 Jinja2 中工作,__setitem__ 解决方案给了我:

access to attribute '__setitem__' of 'dict' object is unsafe

【讨论】:

  • 仅供参考 - 这适用于在使用 python 3 客户端执行状态之前使用 jinja 2 更新 saltstack 支柱。
【解决方案2】:

关键要点:

  1. 字典不支持append()
  2. 您可以使用{% do ... %} 标签将新项目添加到数据字典中,如下所示:

    {% do data.update({'location': node.location}) %}
    
  3. 但是,要使“do”标签正常工作,您需要将 jinja2.ext.do 扩展名添加到您的 jinja 环境中。

【讨论】:

    【解决方案3】:

    字典没有 append 方法。不过,您可以像这样添加键值对:

    {% do data['location']=node.location %} 
    

    {% do data.update({'location': node.location}) %}
    

    【讨论】:

    • 感谢阿尔珀特!虽然使用 {% do data['location']=node.location %} 或 {% do data.update({'location': node.location}) %} 我仍然得到了 TemplateSyntaxError,但是在网上搜索了一些之后我发现我的 jinja 环境缺少 jinja2.ext.do 扩展,因此“do”标签引发了语法错误。现在它工作正常:) 再次感谢!
    • 这个链接也有帮助:stackoverflow.com/questions/2703013/…
    • 第一个{% do data['location'] = node.location %} 对我不起作用,可能是因为data['location'] = node.location 实际上不是一个表达式并且不适用于需要表达式的do
    【解决方案4】:

    没有jinja2.ext.do 扩展,您可以这样做:

    {% set x=my_dict.__setitem__("key", "value") %}
    

    忽略x 变量并使用现在更新的字典。

    UPD:另外,这适用于len() (__len__())、str() (__str__())、repr() (__repr__()) 和许多类似的东西。

    【讨论】:

    • hmm,不起作用,myString="{% set data={} %}{% set data2=data.__setitem__('key','value') %}{{ data2['key'] }}"; a=Environment(loader=BaseLoader()).from_string(myString); a.render() 的输出是''
    • @K.Frank,答案说忽略您分配的变量。 {% set data={} %}{% set x=data.__setitem__('key', 'value') %}{{ data['key'] }}
    • 我在尝试这个时得到access to attribute '__setitem__' of 'dict' object is unsafe(Python3,运行dbt=0.14.2)
    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 2013-09-09
    • 2012-11-21
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多