for-loop - Jinja2:在 for 循环语句中添加新的键/值项
问题描述
我想将新的键/值项附加到 jinja2 for 循环内的哈希中。到目前为止,我只能附加一个静态条目,但我想根据当前元素添加一个测试。
我的数据集如下所示:
people:
- forename: John
name: Doe
gender: M
- forename: Jane
name: Doe
gender: F
我想转储类似的东西:
Hello Mr John Doe
Hello Ms Jane Doe
我可以做类似的事情:
{% for person in people -%}
Hello {{ 'Ms' if person.gender=='F' else 'Mr' }} {{ person.forename }} {{ person.name }}
{% endfor -%}
但我发现这种语法很尴尬,特别是如果我必须多次重复测试。
我的想法是为我的数据添加一个标题键,我正在尝试在 for 语句中执行此操作。
Jinja 接受了combine过滤器:
{% for person in people | map ('combine', { "title": 'M.'} ) -%}
Hello {{ person.title ~ ' ' ~ person.forename ~ ' ' ~ person.name }}
{% endfor -%}
我还可以添加一个测试来选择正确的标题:
{% for person in people | map ('combine', { "title": 'Mr'} if 1==1 else { "title": 'Ms'}) -%}
Hello {{ person.title ~ ' ' ~ person.forename ~ ' ' ~ person.name }}
{% endfor -%}
但是我一直无法访问当前person
,我尝试过像person.gender=='M'
, self.gender=='M'
,的想法this.gender=='M'
,但没有成功。
有什么办法吗?
谢谢 !
解决方案
我正在回答我的问题,因为我终于找到了一种方法。
关键是使用 selectattr 过滤人员数组,然后应用组合并对数组的其余部分再次执行此操作。
{% for person in people | selectattr("gender", "equalto", "F") | map('combine', { 'title': 'Ms' }) +
people | selectattr("gender", "equalto", "M") | map('combine', { 'title': 'Mr' }) -%}
Hello {{ person.title }} {{ person.forename }} {{ person.name }}
{% endfor -%}
for 语句当然更复杂,但循环体很简单。
推荐阅读
- java - 图像捕获不显示相机预览并且文件无效
- java - 从一个列表中删除数据,而另一个列表数据功能无法正常工作
- web - 如何在 Julia 中播放有声读物 .m4b 文件?
- javascript - TypeError: dom.getElementsByTagName is not a function Node.js
- c - 用 C 语言制作数字时钟
- stored-procedures - 如何在雪花中调用存储过程
- javascript - 编译时反应js核心UI构建错误
- pywinauto - PyWinAuto:释放对话框打开过程,以便您可以用它做事
- r - 如何按特定值添加行
- javascript - 我使用 javascript/jquery 允许弹出我网站上的图像,但它似乎不起作用