app_template_filter有多个参数

时间:2015-05-19 22:22:50

标签: python flask jinja2

如何将两个参数传递给app_template_filter [docs]?如果我只使用一个参数,这很有效。但在这种情况下,我需要两个。

@mod.app_template_filter('posts_page')
def posts(post_id, company_id):
    pass
{{ post.id, post.company.id | posts_page }}

错误:

TypeError: posts_page() takes exactly 2 arguments (1 given)

2 个答案:

答案 0 :(得分:6)

来自Jijna docs

  

变量可以通过过滤器修改。过滤器通过管道符号(|)与变量分隔,并且在括号中可以包含可选参数。可以链接多个过滤器。一个过滤器的输出应用于下一个过滤器。

过滤器旨在一次修改一个变量。您正在寻找context processor

  

变量不限于数值;上下文处理器也可以使函数可用于模板(因为Python允许传递函数)

例如,

@app.context_processor
def add():
    def _add(int1, int2):
        return int(int1) + int(int2)
    return dict(add=_add)

可以在模板中用作

{{ add(a, b) }}

您可以将此作为posts_page方法:

@app.context_processor
def posts_page():
    def _posts_page(post_id, company_id):
        # ...
        return value
    return dict(posts_page=_posts_page)

答案 1 :(得分:6)

虽然您可以使用上下文处理器,但它可能并不总是您想要的。

接受的答案中的文档片段说:

  

[Filters]可能在括号中有可选参数。

所以,看看提问者的模板过滤器:

@mod.app_template_filter('posts_page')
def posts(post_id, company_id):
    pass

以下内容在模板中有效:

{{ post.id|posts_page(post.company_id) }}