4

我已经设法通过使用自定义过滤器从 jinja2 调用 python 函数,但我似乎只能调用带有一个或多个参数的函数。在下文中,我必须传递一个垃圾参数才能将 ctest 视为函数而不是变量。

如果我只是打电话也行不通{{ ctest() }}

有没有不同的方法可以强制它成为函数调用,还是我应该使用不同的方法?

代码:

def ctest(stuff):
    return "yeah!"

template_env = jinja2.Environment (loader = jinja2.FileSystemLoader(template_file_root))
#custom filters
template_env.filters['ctest'] = ctest

模板:

Working? {{ junk|ctest }}

输出:

working? yeah!
4

3 回答 3

1

Summarizing the comments into an answer:

The ability to call functions by adding it to filters isn't really the correct way of going about this since (as Wooble pointed out) I'm not looking to filter anything.

Instead the function just needs to be added to the template_env.globals:

template_globals.filters['ctest'] = ctest
于 2012-10-29T22:22:39.957 回答
0

好吧,他们是过滤器,所以他们希望过滤一些东西。如果动机是您希望在不传递任何参数的情况下从模板外部调用函数,请将签名更改为:

def ctest(*args):

然后忽略这些论点;如果它没有传递任何参数或任何数量的参数,它将起作用。

于 2012-07-25T19:34:53.027 回答
0

{{func()}}呈现输出。 带参数{% call func() %}{%endcall%}调用。func()caller

在 jinja 中,似乎没有直接的方法可以在模板中调用 python 函数而不渲染它或其他模板副作用。我想出的解决方法是:

{% if func() %}{% endif %}
于 2013-03-26T13:20:15.500 回答