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

Posted

技术标签:

【中文标题】使用 jinja2 时如何将新条目添加到字典对象中?【英文标题】:How to add a new entry into a dictionary object while using 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 对象添加条目。

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

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

【问题讨论】:

请选择一个有帮助的答案,并用复选标记接受它,以便其他用途可以看到,哪个答案解决了问题。 【参考方案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】:

关键要点:

    字典不支持append()

    您可以使用% do ... % 标签将新项目添加到数据字典中,如下所示:

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

    但是,要使“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”标签引发了语法错误。现在它工作正常:) 再次感谢! 这个链接也有帮助:***.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)

以上是关于使用 jinja2 时如何将新条目添加到字典对象中?的主要内容,如果未能解决你的问题,请参考以下文章

每当将新联系人添加到联系人时,如何添加类似whatsapp的选项以进行联系

需要使用 xsl 将新添加的条目添加到给定 xml 的新列

将新键添加到对象时如何重新渲染 v-for

如何使用 Swift 将新数组数据添加到 plist 文件中的 NSDictionary

如何使用 PlistBuddy 将多个条目添加到 plist 字典

Windows Batch:如何添加主机条目?