定义包括加载程序的环境时,很容易添加自定义过滤器:
from jinja2 import Environment, PackageLoader, select_autoescape
env = Environment(
loader=PackageLoader('tests', 'templates'),
autoescape=select_autoescape(['html', 'xml'])
)
env.filters['rsttable'] = rsttable
但是我很难将自定义过滤器添加到创建Template()
构造函数的模板中:
from jinja2 import Template
def highlight(txt):
return '**%s**' % txt
tpl = Template('hello {{name | highlight}}')
tpl.render(name='me')
产量:
TemplateAssertionError: no filter named 'highlight'
Jinja2 doc对我来说很隐秘:
从构造函数而非模板创建的模板对象 环境确实具有指向 可能与其他模板共享的临时环境 使用构造函数和兼容设置创建。
答案 0 :(得分:1)
如果您的模板是内联字符串(例如您的示例),请使用Environment.from_string()
来获取模板。 (如果是文件,请使用.get_template()
。)
通过这种方式,可以将过滤器注册到环境中。
from jinja2 import Environment, PackageLoader, select_autoescape
env = Environment(
loader=PackageLoader("tests", "templates"),
autoescape=select_autoescape(["html", "xml"]),
)
def highlight(txt):
return "**%s**" % txt
env.filters["highlight"] = highlight
tpl = env.from_string("hello {{name | highlight}}")
tpl.render(name="me")