使用 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的选项以进行联系
如何使用 Swift 将新数组数据添加到 plist 文件中的 NSDictionary