Python 如何在使用jinja2时向dictionary对象添加新条目?

Python 如何在使用jinja2时向dictionary对象添加新条目?,python,dictionary,jinja2,Python,Dictionary,Jinja2,在使用jinja2模板时,我无法将新条目追加到dictionary对象中 例如,这里我使用的是jinja2模板,我创建了一个数据变量,它是一个字典。在检查了一些if条件后,I希望将位置属性附加到数据对象,例如 {%- set data = { 'name' : node.Name, 'id' : node.id, } -%} {% if node.location !="" %} da

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

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

{%- 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'
有没有人面临过这个问题,或者可以提供解决这个问题的参考

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

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


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

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

    主要收获:

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

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


  • 没有
    jinja2.ext.do
    扩展名,您可以执行以下操作:

    {% set x=my_dict.__setitem__("key", "value") %}
    
    忽略
    x
    变量,使用现在更新的字典


    UPD:同样,这适用于
    len()
    ),
    str()
    ),
    repr()
    ),
    repr()
    )(
    )(
    )和许多类似的东西。

    没有
    扩展名doo

    {%- set _ = dict.update({c.name: c}) -%}
    
    在Python 3上的base Jinja2中工作,
    \uuuuu setitem\uuuu
    解决方案为我提供:

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

    谢谢阿尔伯特!虽然在使用了{%do data['location']=node.location%}或{%do data.update({'location':node.location})%}之后,我仍然得到了TemplateSyntaxError,但在web上搜索了一段时间后,我发现我的jinja环境缺少jinja2.ext.do扩展名,因为“do”标记抛出了语法错误。现在工作正常:)再次感谢!!这个链接也有帮助:第一个
    {%do data['location']=node.location%}
    对我不起作用,可能是因为
    data['location']=node.location
    实际上不是一个表达式,也不适用于
    do
    ,它需要表达式?请选择一个有帮助的答案并用复选标记接受它,因此,其他使用可以看出,解决问题的答案是什么。hmm,不起作用,使用
    myString=“{%set data={}%}{%set data2=data.\uuuuuu setitem{('key','value')%}{{{data2['key']}”;a=环境(loader=BaseLoader())。来自_字符串(myString);a、 render()
    输出为
    '
    @K.Frank,答案是忽略指定的变量<代码>{%set data={}%}{%set x=data.{uuuuu setitem_uuuuu('key','value')}{{data['key']}}
    尝试此操作(Python3,running=0.14.2)FYI时,我获得了对'dict'对象的属性'\uuuuuu setitem.'uuuuuuuuuuu'的
    访问权,这对于在python 3客户端执行状态之前使用jinja 2更新盐栈支柱非常有效。
    
    access to attribute '__setitem__' of 'dict' object is unsafe