Jinja2: Наследование шаблонов шаблонов?
Я бы хотел создать плавную страницу Jinja2 и Markdown с помощью шаблона, который выглядит так:
{% block title %}{{ title }}{% endblock %}
# {{ title[0] }}
# {{ title[1] }}
## Introduction
Я могу получить этот выше код, чтобы сгенерировать HTML отлично, но поскольку я использую этот script для настраиваемого приложения для разработки, я бы хотел, чтобы определить основные шаблоны для каждого типа записи.
Когда я пытаюсь сделать вышеприведенную страницу, расширив основной шаблон, 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
Средство рендеринга 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" %}