2012-07-25 157 views
4

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

如果我打电话给{{ 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! 
+0

可能重复[调用从Jinja2的一个Python函数(http://stackoverflow.com/questions/6036082/call-a-python-function-from-jinja2) – geoffspear 2012-07-25 19:41:22

+0

我在发布之前查看了这个问题,但并未解释如何在不带参数的模板中调用过滤器。它只是解释了如何达到我已经在的程度。 – chrisst 2012-07-25 21:00:09

+0

看到第二个答案:'{{clever_function()}}' – geoffspear 2012-07-25 22:40:04

回答

1

总结各种意见,回答:

将其添加到过滤器调用功能的能力是不是真的,因为要对这个正确的方法(如Wooble指出的),我不希望过滤任何东西。

取而代之的是功能只需要被添加到template_env.globals:

template_globals.filters['ctest'] = ctest 
0

那么,他们是过滤器,所以他们期望得到的东西过滤。如果动机是要发挥作用是从模板外调用没有传递任何参数,签名改为:

def ctest(*args): 

,然后忽略的参数;如果它没有传递任何参数或任何数量的参数,它就会工作。

+1

上面的例子适用于我,但我仍然想调用零参数方法。 我希望能够调用其他python库而不必编写包装方法。特别是我试图调用socket.gethostname()。 – chrisst 2012-07-25 19:39:08

+0

你好,从未来大声笑 你有没有尝试过使用lambda?我理解它本质上是包装一个功能,但比平常少打字。 我厌倦了这个'tempEnv.globals ['test'] = lambda:socket.gethostname()'它工作。 – 2016-11-06 13:31:33

0

{{func()}}渲染输出。 {% call func() %}{%endcall%}使用caller参数调用func()

在jinja中真的好像没有直接的方法来调用模板中的python函数,而不会呈现它或其他模板副作用。我想出了解决方法是:

{% if func() %}{% endif %} 
相关问题