Jinja2模板语言有“这里”(当前目录)的概念吗?

34 投票
4 回答
41276 浏览
提问于 2025-04-15 18:45

Jinja2支持模板相对路径吗?比如说 %(here)s/other/template.html,这样可以根据当前模板在文件系统中的位置来包含其他模板吗?

4 个回答

10

根据jinja2.Environment.join_path()的文档,我们可以通过重写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)
22

我想补充一下Will McCutchen的回答,

你可以在你的加载器里设置多个文件夹。它会按照顺序在每个文件夹里搜索,直到找到你需要的模板。

举个例子,如果你想用"sidebar.html"来代替"/includes/sidebar.html",你可以这样设置:

loader=jinja2.FileSystemLoader(
        [os.path.join(os.path.dirname(__file__),"templates/includes"),
         os.path.join(os.path.dirname(__file__),"templates")])

而不是

loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__),"templates"))
51

我不这么认为。通常情况下,你需要通过指定模板的路径来包含或扩展其他模板,这个路径是相对于你使用的模板加载器和环境的根目录的。

假设你的所有模板都放在 /path/to/templates 这个文件夹里,而你已经这样设置了 Jinja:

import jinja2
template_dir = '/path/to/templates'
loader = jinja2.FileSystemLoader(template_dir)
environment = jinja2.Environment(loader=loader)

现在,如果你想在 /path/to/templates/index.html 模板中包含 /path/to/templates/includes/sidebar.html,你可以在你的 index.html 中写如下内容:

{% include 'includes/sidebar.html' %}

然后 Jinja 会自动找到这个文件。

撰写回答