如何在Jinja2中包含相对路径的模板
我在一个模板里想要引入同一个文件夹里的另一个模板。为此,我用了 {% import 'header.jinja2' %}
这段代码。但是我总是遇到 TemplateNotFound
的错误。
我的模板文件夹结构是这样的:
+ myProject
|
+--+ templates
|
+--+ arby
| |-- header.jinja2
| |-- footer.jinja2
| +-- base.jinja2
|
+--+ bico
|-- header.jinja2
|-- footer.jinja2
+-- base.jinja2
所以当我渲染 arby 的 'base.jinja2' 时,我想要引入 'arby/header.jinja2',而当我渲染 bico 的 'base.jinja2' 时,我想要引入 'bico/header.jinja2'。问题是,我不想在 {% include 'arby/base.jinja2' %}
里写上 'arby/' 或 'bico/' 这样的前缀。这样做可以吗?
谢谢!
2 个回答
1
这个回答来得有点晚,不过如果你遇到这个问题,可以在base.jinja2文件里这样做。
{%import 'arby/header.jinja2' as header%}
jinja应该知道模板的路径,所以在模板的子文件夹里指定一个文件应该很简单,只需要用文件夹/文件名.扩展名的格式。
注意: 这是从flask的角度来看。
16
在 jinja2.Environment.join_path() 的文档说明中,有一个提示提到可以通过创建一个新的类来继承 Environment,并重写 join_path() 方法,这样就能支持相对于当前模板(也就是 join_path 方法中的 parent 参数)的 import
路径。
下面是一个这样的类的例子:
import posixpath
class RelEnvironment(jinja2.Environment):
"""Override join_path() to enable relative template paths."""
def join_path(self, template, parent):
return posixpath.join(posixpath.dirname(parent), template)