如何将继承与直接在Python源代码文件中编码的Jinja2模板一起使用?

时间:2014-02-20 15:37:05

标签: python inheritance jinja2 template-engine

我有一个基本模板base.html和一个派生模板page2.html,如下所示:

{# page2.html#}
{% extends "base.html" %}
{# end #}

我可以使用:

渲染模板
jinjaEnv = Environment()
jinjaEnv.loader = FileSystemLoader('.')

@app.route('/page2')
def page2():
    page2Tem = jinjaEnv.get_template("page2.html")
    h = page2Tem.render()
    return h

这很好用。但是当我尝试:

nfpTem = Template("""\
{% extends "base.html" %}
stuff
""")
@app.route('/newfrontpage')
def frontPage():
    h = nfpTem.render()
    return h

我收到错误:

TypeError: no loader for this environment specified

如何在我的Python源代码中放置模板并使用继承,或者这是不可能的?

1 个答案:

答案 0 :(得分:1)

您的代码存在的问题是,jinja会尝试使用加载程序在您的模板上找到'base.html' {% extends "base.html" %}。如果你想让它工作,你需要实例化一个加载器,如果你想要python脚本上的嵌入数据,一个简单的加载器就是DictLoader就像这个例子:

import jinja2

loader = jinja2.DictLoader(
    {'base': 
        'this will be filled {% block to_fill %}{% endblock %}',
     'child':
         '{% extends "base" %} {% block to_fill %}filled from child with value {{ value }}{% endblock %}'
    })
env = jinja2.Environment(loader=loader)
print env.get_or_select_template('base').render()
print env.get_or_select_template('child').render(value='foo')