如何选择/减少Flask/Jinja中的词典列表

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_dictsJinja模板?

我试着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

  • 再次用Google搜索并找到了我自己的答案.:) (10认同)

Aik*_*ude 5

对于没有 selectattr 的人(例如,您坚持使用 Jinja2.6),并且不想制作另一个自定义过滤器,这两行将很快解决您的问题。

{% set selection = [] %}
{% for x in biglist if x.criteria == 'pickme' %}{% do selection.append(x) %}{% endfor %}
Run Code Online (Sandbox Code Playgroud)