Mat*_*ris 43 python jinja2 python-import
是否可以将Python模块导入Jinja模板,以便我可以使用它的功能?
例如,我有一个format.py文件,其中包含格式化日期和时间的方法.在神社宏,我可以做一些像下面?
{% from 'dates/format.py' import timesince %}
{% macro time(mytime) %}
<a title="{{ mytime }}">{{ timesince(mytime) }}</a>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
因为format.py不是模板,上面的代码给出了这个错误:
UndefinedError: the template 'dates/format.py' (imported on line 2 in 'dates/macros.html') does not export the requested name 'timesince'
Run Code Online (Sandbox Code Playgroud)
......但我想知道是否还有另一种方法来实现这一目标.
Woo*_*ble 54
在模板中,不,你不能导入python代码.
这样做的方法是将该函数注册为jinja2 自定义过滤器,如下所示:
在你的python文件中:
from dates.format import timesince
environment = jinja2.Environment(whatever)
environment.filters['timesince'] = timesince
# render template here
Run Code Online (Sandbox Code Playgroud)
在您的模板中:
{% macro time(mytime) %}
<a title="{{ mytime }}">{{ mytime|timesince }}</a>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
nig*_*ool 25
只需将函数传递给模板,就像这样
from dates.format import timesince
your_template.render(timesince)
Run Code Online (Sandbox Code Playgroud)
在模板中,只需像任何其他函数一样调用它,
{% macro time(mytime) %}
<a title="{{ mytime }}">{{ timesince(mytime) }}</a>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
函数是python中的一等公民,所以你可以像其他任何东西一样传递它们.如果你愿意,你甚至可以传入一个完整的模块.
import importlib
my_template.render( imp0rt = importlib.import_module ) # can't use 'import', because it's reserved
Run Code Online (Sandbox Code Playgroud)
(您也可以"import"
通过将参数传递给来命名它dict
)
kwargs = { 'import' : importlib.import_module }
my_template.render( **kwargs )
Run Code Online (Sandbox Code Playgroud)
然后在jinja-template中,您可以导入任何模块:
{% set time = imp0rt( 'time' ) %}
{{ time.time() }}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
33765 次 |
最近记录: |