简体   繁体   English

python&jinja2:执行预定义的过滤器列表

[英]python & jinja2: execute pre-defined list of filters

Trying to do something like this: 尝试做这样的事情:

filters = ['foo', 'bar']

And then in a Jinja2 template: 然后在Jinja2模板中:

<p>{{value|filter for filter in filters}}</p>

Where foo and bar are Jinja2 filters I've defined. foobar是我定义的Jinja2过滤器。

This isn't working but it seems like it should be easy enough to accomplish. 这是行不通的,但似乎应该很容易完成。 Any thoughts? 有什么想法吗?

Assuming you're using flask (otherwise just adjust for however your filters are defined), you can just create a filter to apply the named filters. 假设您使用的是长颈瓶(否则只需调整但要定义过滤器),就可以创建一个过滤器以应用命名的过滤器。

In your filter definitions (eg my_filters.py ): 在您的过滤器定义中(例如my_filters.py ):

def filter1(x):
    return 'filtered1( {} )'.format(x)
app.jinja_env.filters['filter1'] = filter1 # Register filter

def filter2(x):
    return 'filtered2( {} )'.format(x)
app.jinja_env.filters['filter2'] = filter2

# Create a filter to apply a list of filters by name...
def apply_filters_by_name(x, filter_names):
    result = x
    # Loop through filter names and apply them sequentially
    for fname in filter_names: 
        # Get the filter function matching this name
        filter_function = app.jinja_env.filters[fname]

        # Apply the filter
        result = filter_function(result) # apply filter

    return result
app.jinja_env.filters['apply_filters_by_name'] = apply_filters_by_name

...so in your HTML template, for example: ...因此在您的HTML模板中,例如:

{% set some_filter_names = ['filter1', 'filter2'] %}
{{ 'hello world'|apply_filters_by_name(some_filter_names) }}

Here, I've set some_filter_names inside the template but obviously you could also pass it in as a variable instead. 在这里,我在模板中设置了some_filter_names,但是显然您也可以将其作为变量传递。

The result is: 结果是:

filtered2( filtered1( hello world ) )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM