Jinja2模板语言有“这里”(当前目录)的概念吗?
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 会自动找到这个文件。