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

问题描述 投票:0回答:3

我正在尝试在模板中包含同一文件夹中的另一个模板。为此,我只是做

{% 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/' 前缀。这可能吗?

谢谢

python templates include render jinja2
3个回答
14
投票

jinja2.Environment.join_path() 文档字符串中有一个关于子类化 Environment 和重写 join_path() 方法的提示,以支持相对于当前(即 join_path 的

parent
参数)模板的 import 路径。

这是此类的一个示例:

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)

1
投票

这个答案来晚了,但对于任何遇到这个问题的人来说,你可以像在base.jinja2中那样做

{%import 'arby/header.jinja2' as header%}

jinja 应该知道模板的路径,因此在模板的子文件夹中指定文件应该很容易,就像文件夹/文件.扩展名一样。

注意:来自烧瓶视角


0
投票

答案是使用 os.path

import os

path = os.path.dirname(os.path.realpath(__file__)
© www.soinside.com 2019 - 2024. All rights reserved.