如何在使用jinja2时将新条目添加到字典对象中?

hem*_*rik 14 python dictionary jinja2

在使用jinja2模板时,我无法追加向字典对象添加新条目.

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

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

{% if node.location !="" %}
    data.append({'location': node.location}) 
{% endif %}
Run Code Online (Sandbox Code Playgroud)

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

jinja2.exceptions.UndefinedError: 'dict object' has no attribute 'append'
Run Code Online (Sandbox Code Playgroud)

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

我在网上搜索但找不到解决方案,即如何在Jinja中为dict对象添加一个条目.

我已经提到了以下和其他网络资源:

  1. http://cewing.github.io/training.codefellows/assignments/day22/jinja2_walkthrough.html
  2. 在Jinja2中,将所有键设置为字典值的最简单方法是什么?
  3. https://github.com/saltstack/salt/issues/27494

Арс*_*гин 13

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

{% set x=my_dict.__setitem__("key", "value") %}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 尝试此操作时,我得到“访问‘dict’对象的属性‘__setitem__’是不安全的”(Python3,运行 [dbt](https://www.getdbt.com/)=0.14.2) (3认同)

alp*_*ert 9

字典没有append方法.您可以添加这样的键值对:

{% do data['location']=node.location %} 
Run Code Online (Sandbox Code Playgroud)

要么

{% do data.update({'location': node.location}) %}
Run Code Online (Sandbox Code Playgroud)

  • 第一个`{%do data ['location'] = node.location%}`对我来说不起作用,可能是因为`data ['location'] = node.location`实际上不是表达式而且不能用于` do`,哪些表达式? (3认同)
  • 谢谢阿尔珀特!虽然在使用 {% do data['location']=node.location %} 或 {% do data.update({'location': node.location}) %} 之后我仍然得到 TemplateSyntaxError,但在网上搜索后我发现我的 jinja 环境缺少 jinja2.ext.do 扩展,因为“do”标签引发了语法错误。现在它工作正常:) 再次感谢! (2认同)

hem*_*rik 7

关键要点:

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

    {% do data.update({'location': node.location}) %}
    
    Run Code Online (Sandbox Code Playgroud)
  3. 但是,jinja2.ext.do要使"do"标记正常工作,您需要将扩展名添加到jinja环境中.


dsz*_*dsz 7

没有do扩展名:

{%- set _ = dict.update({c.name: c}) -%}
Run Code Online (Sandbox Code Playgroud)

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

access to attribute '__setitem__' of 'dict' object is unsafe
Run Code Online (Sandbox Code Playgroud)


小智 6

没有任何扩展名:

{% set d1 = {'a':'b', 'c':'d'} %}
{% set d2 = {'e':'f'} %}

{{ dict(d1, **d2) }}
Run Code Online (Sandbox Code Playgroud)

基本上,您将两个字典合并以创建一个新字典。由于它不使用任何扩展,因此它也适用于 Home Assistant。