【发布时间】:2013-12-30 00:31:41
【问题描述】:
我有一个带有字典列表的 Jinja 模板。订单很重要。我想根据字典的键/值减少列表或查找值。这是一个例子:
{%
set ordered_dicts = [
{
'id': 'foo',
'name': 'My name is Foo'
},
{
'id': 'bar',
'name': 'My name is Bar'
}
]
%}
如果我有一个变量 some_id = 'foo',我如何在我的 Jinja 模板中从 ordered_dicts 中得到 'My name is Foo'?
我尝试了select() 和selectattr(),但根据文档无法弄清楚它们。这是我尝试过的:
{{ ordered_dicts|selectattr("id", "foo") }}
输出:
<generator object _select_or_reject at 0x10748d870>
我认为我没有正确理解 select() 和 selectattr() 的用法。
我是否需要遍历列表并手动进行查找?
更新:
正如 codegeek 和 gipi 指出的那样,我需要用生成器做这样的事情:
{{ ordered_dicts|selectattr("id", "foo")|list }}
产生的错误:TemplateRuntimeError: no test named 'foo',它阐明了selectattr() 的工作原理。第二个参数必须是the builtin tests 之一。据我所知,这些测试都不会让我检查与键关联的值是否与另一个值匹配。这是我想做的:
{{ ordered_dicts|selectattr("id", "sameas", "foo")|list }}
但这不起作用,因为sameas 测试检查两个对象是否真的是内存中的同一个对象,而不是两个字符串/数字是否相等。
那么是否可以根据键/值比较测试来选择项目?
【问题讨论】:
-
你需要进一步迭代它,因为你得到了一个生成器对象。
-
应该等于,但我自己似乎无法让这个工作