Jinja2是否支持与模板相关的路径,例如%(here)s/other/template.html
,包括相对于当前模板在文件系统中的位置的其他模板?
答案 0 :(得分:36)
我不相信。通常,您通过指定相对于您正在使用的任何模板加载器和环境的根的路径来包含或扩展其他模板。
因此,假设您的模板全部位于/path/to/templates
,您就像这样设置了Jinja:
import jinja2
template_dir = '/path/to/templates'
loader = jinja2.FileSystemLoader(template_dir)
environment = jinja2.Environment(loader=loader)
现在,如果您想在/path/to/templates/includes/sidebar.html
模板中添加/path/to/templates/index.html
,请在index.html
中填写以下内容:
{% include 'includes/sidebar.html' %}
和Jinja会弄清楚如何找到它。
答案 1 :(得分:15)
只是添加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"))
答案 2 :(得分:7)
根据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)
答案 3 :(得分:2)
克服此限制的最简洁方法是使用jinja2扩展程序,允许import relative template names
喜欢的东西:
from jinja2.ext import Extension
import re
class RelativeInclude(Extension):
"""Allows to import relative template names"""
tags = set(['include2'])
def __init__(self, environment):
super(RelativeInclude, self).__init__(environment)
self.matcher = re.compile("\.*")
def parse(self, parser):
node = parser.parse_include()
template = node.template.as_const()
if template.startswith("."):
# determine the number of go ups
up = len(self.matcher.match(template).group())
# split the current template name into path elements
# take elements minus the number of go ups
seq = parser.name.split("/")[:-up]
# extend elements with the relative path elements
seq.extend(template.split("/")[1:])
template = "/".join(seq)
node.template.value = template
return node