如何在Jinja2中包含相对路径的模板

19 投票
2 回答
14630 浏览
提问于 2025-04-17 08:24

我在一个模板里想要引入同一个文件夹里的另一个模板。为此,我用了 {% 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)

撰写回答