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

Mar*_*ann 13 python templates render include jinja2

我正在尝试在模板中包含另一个位于同一文件夹中的文件.要做到这一点,我只是这样做{% import 'header.jinja2' %}.问题是我不断收到TemplateNotFound错误.

我的模板文件夹看起来像

+ myProject
|
+--+ templates
   |
   +--+ arby
   |  |-- header.jinja2
   |  |-- footer.jinja2
   |  +-- base.jinja2
   |
   +--+ bico
      |-- header.jinja2
      |-- footer.jinja2
      +-- base.jinja2
Run Code Online (Sandbox Code Playgroud)

因此,当我渲染arby的'base.jinja2'时,我想包含'arby/header.jinja2',当我渲染bico的'base.jinja2'时,我想包含'bico/header.jinja2'.问题是我不想在{%include'arby/base.jinja2'%}中写'arby /'或'bico /'前缀.这可能吗?

谢谢

Gar*_*ett 10

jinja2.Environment.join_path() docstring中有一个关于子类化Environment并覆盖join_path()方法以支持import相对于当前(即join_path 的参数)模板的路径的提示.

以下是此类的示例:

class RelEnvironment(jinja2.Environment):
    """Override join_path() to enable relative template paths."""
    def join_path(self, template, parent):
        return os.path.join(os.path.dirname(parent), template)
Run Code Online (Sandbox Code Playgroud)

  • 小心 - 由于 Jinja 问题 411 和 412,这在 Windows 上不起作用 - os.path.dirname 和 os.path.join 将使用 `'\\'`,FilesystemLoader 将拒绝。确保结果用 `'/'` 而不是 `os.path.sep` 分隔。 (3认同)