Dav*_*man 7 python customization plugins templates jinja2
我正在编写一些Jinja2模板,我希望能够在切向相关项目中尽可能轻松地重用这些模板.我有一套自定义便利过滤器,我希望模板随身携带.是否有用于将过滤器定义嵌入模板本身的Jinja2语法?或者是一种将任何类型的纯Python函数嵌入到Jinja2模板中的机制,该模板可以作用于传递给模板的变量?我曾经使用mako,并且在那里做这件事是微不足道的,但是由于缺乏自定义语法,在mako中模板化LaTeX是痛苦的,所以我不得不进行切换.
fla*_*ini 20
有NO,你可以直接把Python到Jinja2的模板,我所知道的是在你的应用程序定义,并将它们添加到您的Jinja2环境实例的方式方法.如以下示例摘自http://jinja.pocoo.org/docs/dev/api/#writing-filters.
import jinja2
loader = jinja2.FileSystemLoader('/tmp')
env = jinja2.Environment(autoescape=True, loader=loader)
def upperstring(input):
return input.upper()
env.filters['upperstring'] = upperstring
temp = env.get_template('template.html')
temp.render(name="testing")
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的模板
{{ name | upperstring }}
Run Code Online (Sandbox Code Playgroud)
结果就是这个
TESTING
Run Code Online (Sandbox Code Playgroud)
有一种简单的方法可以在jinja2模板中添加自定义过滤器。
FILTERS是包含我们可以用来呈现模板的所有过滤器的字典。但是,我们可以为其添加更多过滤器。
这是向其添加新过滤器的快速示例。
from jinja2 import Template
from jinja2.filters import FILTERS, environmentfilter
@environmentfilter
def do_reverse_by_word(environment, value, attribute=None):
"""
custom max calculation logic
"""
if attribute:
return [list(reversed(i.get(attribute).split())) for i in value]
return list(reversed(value.split()))
FILTERS["reverse_by_word"] = do_reverse_by_word
print(Template("{{ name | reverse_by_word }}").render({"name": "Stack Overflow"}))
print(Template("{{ names | reverse_by_word(attribute='name') }}").render({"names": [{"name": "Stack Overflow"}, {"name": "Stack Exchange"}]}))
Run Code Online (Sandbox Code Playgroud)
输出
['Overflow', 'Stack']
[['Overflow', 'Stack'], ['Exchange', 'Stack']]
Run Code Online (Sandbox Code Playgroud)
如果您有更复杂的用例,请在下面发表评论。我很乐意回答您的所有疑问。
| 归档时间: |
|
| 查看次数: |
11735 次 |
| 最近记录: |