Jinja2:如何渲染模板继承?

11

我想使用模板来呈现一个融合了Jinja2和Markdown的页面,模板长这样:

{% block title %}{{ title }}{% endblock %}

# {{ title[0] }}
# {{ title[1] }}

## Introduction

我可以正常生成上面的HTML代码,但是由于我正在使用这个脚本做一个自定义的作者应用程序,所以我想能够为每种类型的条目定义主模板。

当我尝试通过扩展主模板template.html来呈现上面的页面时:

{% extends 'template.html' %}

{% block title %}{{ title }}{% endblock %}

# {{ title[0] }}
# {{ title[1] }}

## Introduction

我得到了一个错误:

Traceback (most recent call last):
  File "compiler.py", line 55, in <module>
    template = Template(text).render(parser.vars)
  File "/usr/lib/python2.7/site-packages/jinja2/environment.py", line 891, in render
    return self.environment.handle_exception(exc_info, True)
  File "<template>", line 1, in top-level template code
TypeError: no loader for this environment specified
你可以看到有问题的那一行是template = Template(text).render(parser.vars)
是否有方法能够渲染上述模板代码并能够扩展template.html
1个回答

21

Jinja的渲染器需要知道如何加载template.html,因此您需要为Environment提供一个模板加载器实例。

例如,假设文件page.htmltemplate.html在当前目录中:

from jinja import FileSystemLoader
from jinja.environment import Environment

env = Environment()
env.loader = FileSystemLoader('.')
tmpl = env.get_template('page.html')
print tmpl.render(parser.vars)
更新 - 您可以创建自定义模板加载程序,或使用jinja2.loaders中定义的现有类之一。例如,DictLoader将在dict()实例中查找template.html,并将值视为模板数据。从几乎任何地方加载您的模板应该很简单(例如,memcache、mysql、redis、Python对象等)。

使用DictLoader的示例:

pages = ('template.html', 'page.html')
templates = dict((name, open(name, 'rb').read()) for name in pages)
env.loader = DictLoader(templates)

page.html


这是一个HTML标记,表示一个页面的文件名为“page.html”。不需要添加解释或进行修改。
{% extends "template.html" %}

哇,谢谢!我是否被迫将我的模板保存到文本文件中,或者get_template可以使用字符串输入?我会再次阅读文档... - Blender
不用谢!我在答案中加入了一些关于Jinja模板加载器的详细信息。 - samplebias
我正在使用 DictLoader,但是回溯信息完全奇怪:jinja2.exceptions.TemplateNotFound: (我的模板 HTML 在这里)。我正常定义了 dict{'templates/article.html': '...', ...},但只有在我反转它时才会被读取。什么情况...? - Blender
嗯,DictLoader 对我来说是有效的(我在本地更改了我的示例并且它可以工作)。你确定你使用的路径是正确的吗?例如,在 {% extends "name.html" %} 中使用的路径是否与字典键完全匹配? - samplebias
面露尴尬。原来我正在渲染内部变量“模板”,而这实际上是我的模板代码。感谢你的帮助。 - Blender
4
你的意思是“来自jinja2...”吗? - bradley.ayers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接