Jinja2:渲染模板继承?

Ble*_*der 11 python extend jinja2

我想使用模板渲染融合的Jinja2和Markdown页面,如下所示:

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

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

## Introduction
Run Code Online (Sandbox Code Playgroud)

我可以使用上面的代码来生成HTML,但是当我将此脚本用于自定义创作应用程序时,我希望能够为每种类型的条目定义主模板.

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

{% extends 'template.html' %}

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

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

## Introduction
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

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
Run Code Online (Sandbox Code Playgroud)

你可以看到有问题的一行template = Template(text).render(parser.vars).

有什么方法可以渲染上面的模板代码并能够扩展template.html吗?

sam*_*ias 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)
Run Code Online (Sandbox Code Playgroud)

更新 - 您可以创建自定义模板加载器,或使用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)
Run Code Online (Sandbox Code Playgroud)

page.html中

{% extends "template.html" %}
Run Code Online (Sandbox Code Playgroud)

  • 你是说`来自jinja*2*......? (4认同)