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

2024-04-18 20:15:09 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试这样做:

filters = ['foo', 'bar']

然后在Jinja2模板中:

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

其中foobar是我定义的Jinja2过滤器。你知道吗

这是不工作,但它似乎应该是很容易做到的。有什么想法吗?你知道吗


Tags: in模板过滤器jinja2for定义foovalue
1条回答
网友
1楼 · 发布于 2024-04-18 20:15:09

假设您使用的是flask(否则只需根据定义的过滤器进行调整),您只需创建一个过滤器即可应用指定的过滤器。你知道吗

在筛选器定义中(例如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

…因此在HTML模板中,例如:

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

在这里,我在模板中设置了一些过滤器名称,但显然您也可以将其作为变量传入。你知道吗

结果是:

filtered2( filtered1( hello world ) )

相关问题 更多 >