Jinja2 是否支持模板相对路径,例如%(here)s/other/template.html
,包含与当前模板在文件系统中的位置相关的其他模板?
问问题
31765 次
4 回答
44
我不相信。通常,您通过指定相对于您正在使用的任何模板加载器和环境的根目录的路径来包含或扩展其他模板。
所以假设你的模板都在/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 会想办法找到它。
于 2010-02-01T22:38:46.093 回答
18
只是为了补充 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"))
于 2012-03-19T00:42:56.897 回答
9
根据 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)
于 2010-09-07T05:02:09.283 回答
2
克服此限制的最简洁方法是使用 jinja2 扩展,该扩展将允许导入相关模板名称
类似的东西:
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
于 2014-07-06T20:48:40.377 回答