No *_*ses 19 python jinja2 flask
我有一个带有字典列表的Jinja模板.订单很重要.我想根据字典的键/值减少列表或查找值.这是一个例子:
{%
set ordered_dicts = [
{
'id': 'foo',
'name': 'My name is Foo'
},
{
'id': 'bar',
'name': 'My name is Bar'
}
]
%}
Run Code Online (Sandbox Code Playgroud)
如果我有变量some_id = 'foo'
,我如何'My name is Foo'
退出ordered_dicts
Jinja模板?
我试着select()
和selectattr()
想不出他们出基于文档.这是我试过的:
{{ ordered_dicts|selectattr("id", "foo") }}
Run Code Online (Sandbox Code Playgroud)
那输出:
<generator object _select_or_reject at 0x10748d870>
Run Code Online (Sandbox Code Playgroud)
我不认为我理解使用select()
和selectattr()
正确.
我是否需要遍历列表并手动执行查找?
更新:
正如codegeek和gipi指出的那样,我需要用生成器做这样的事情:
{{ ordered_dicts|selectattr("id", "foo")|list }}
Run Code Online (Sandbox Code Playgroud)
由此产生的错误:TemplateRuntimeError: no test named 'foo'
,澄清了如何selectattr()
工作.第二个参数必须是内置测试之一.据我所知,这些测试都不会让我检查与键相关的值是否与另一个值匹配.这是我想做的事情:
{{ ordered_dicts|selectattr("id", "sameas", "foo")|list }}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为sameas
测试检查两个对象是否真的是内存中的同一个对象,而不是两个字符串/数字是否相等.
那么可以根据键/值比较测试来选择项目吗?
art*_*olk 22
我刚才这样向后移植equalto
:
app.jinja_env.tests['equalto'] = lambda value, other : value == other
Run Code Online (Sandbox Code Playgroud)
之后,2.8文档的这个例子起作用:
{{ users|selectattr("email", "equalto", "foo@bar.invalid") }}
Run Code Online (Sandbox Code Playgroud)
更新:Flask有一个用于注册测试的装饰器,语法稍微清晰:http://flask.pocoo.org/docs/api/#flask.Flask.template_test
对于没有 selectattr 的人(例如,您坚持使用 Jinja2.6),并且不想制作另一个自定义过滤器,这两行将很快解决您的问题。
{% set selection = [] %}
{% for x in biglist if x.criteria == 'pickme' %}{% do selection.append(x) %}{% endfor %}
Run Code Online (Sandbox Code Playgroud)