我正在使用jinja2,并且我想调用一个python函数作为帮助器,使用类似的语法,就像我在调用宏一样。jinja2似乎有意阻止我进行函数调用,并坚持让我通过将函数作为宏复制到模板中来重复自己。
有什么简单的方法可以做到这一点吗?而且,有没有办法导入一整套python函数并从jinja2访问它们,而不需要经历一大堆繁琐的工作(例如编写扩展)?
发布于 2011-08-29 12:26:11
对于那些使用Flask的人,把这个放到你的__init__.py
中
def clever_function():
return u'HELLO'
app.jinja_env.globals.update(clever_function=clever_function)
并在您的模板中使用{{ clever_function() }}
调用它
发布于 2014-11-24 08:42:11
from jinja2 import Template
def custom_function(a):
return a.replace('o', 'ay')
template = Template('Hey, my name is {{ custom_function(first_name) }} {{ func2(last_name) }}')
template.globals['custom_function'] = custom_function
您还可以根据Matroskin's answer在字段中指定函数
fields = {'first_name': 'Jo', 'last_name': 'Ko', 'func2': custom_function}
print template.render(**fields)
将输出:
Hey, my name is Jay Kay
适用于Jinja2版本2.7.3
如果您想要一个装饰器来简化在template.globals
上定义函数,请查看Bruno Bronosky's answer
发布于 2017-11-15 00:49:00
我喜欢@AJP's answer。我一字不差地使用它,直到我有了很多函数。然后我换成了Python function decorator。
from jinja2 import Template
template = '''
Hi, my name is {{ custom_function1(first_name) }}
My name is {{ custom_function2(first_name) }}
My name is {{ custom_function3(first_name) }}
'''
jinga_html_template = Template(template)
def template_function(func):
jinga_html_template.globals[func.__name__] = func
return func
@template_function
def custom_function1(a):
return a.replace('o', 'ay')
@template_function
def custom_function2(a):
return a.replace('o', 'ill')
@template_function
def custom_function3(a):
return 'Slim Shady'
fields = {'first_name': 'Jo'}
print(jinga_html_template.render(**fields))
幸好函数有一个__name__
!
https://stackoverflow.com/questions/6036082
复制相似问题