我想使用模板渲染一个融合的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
吗?
答案 0 :(得分:19)
Jinja的渲染器需要知道如何加载template.html
,因此您需要为Environment
提供模板加载器实例。
例如,假设文件page.html
和template.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
会在template.html
实例中查找dict()
,并将该值视为模板数据。从几乎任何地方加载模板应该很简单(例如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中强>
{% extends "template.html" %}