【问题标题】:How do I use inheritance with a Jinja2 template encoded directly in a Python source code file?如何将继承与直接编码在 Python 源代码文件中的 Jinja2 模板一起使用?
【发布时间】:2014-02-20 15:37:05
【问题描述】:

我有一个基本模板 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 源代码并使用继承,或者这不可能?

【问题讨论】:

    标签: python inheritance jinja2 template-engine


    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 2015-04-14
      • 2013-01-25
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多