首页 > 解决方案 > 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',但没有成功。

有什么办法吗?

谢谢 !

标签: for-loopjinja2

解决方案


我正在回答我的问题,因为我终于找到了一种方法。

关键是使用 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 语句当然更复杂,但循环体很简单。


推荐阅读