Jinja2 for Flask没有拿起儿童模板

时间:2015-03-17 09:19:10

标签: python flask jinja2

我正在尝试编写一个包含三个部分的电子邮件html文件:页眉,正文和页脚。它们包含在主要的mail.html文件中,如下所示:

<html>
   <body>
     <p>
      <table border="0" cellpadding="0" cellspacing="0" style="font-size: 12.727272033691406px; line-height: 1.2em; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; border-spacing: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; background-color: rgb(231, 232, 232); border-top-style: solid; border-top-color: rgb(221, 221, 221);" width="100%">
        <tbody>
            <tr>
                <td align="center" style="font-family: arial, sans-serif; margin: 0px;" width="100%">

                    {% block head %}
                    {% endblock %}

                    {% block body %}
                    {% endblock %}
                <br/>

                     {% block footer %}
                     {% endblock %}
                </td>
           </tr>
        </tbody>
     </table>
    </p>
   </body>
</html>

基本上是一个包含三个子temnplates的父模板,它们都在同一目录中。已在以下两个标记之间描述了子模板:

{% extends "mail.html" %}
{% block head %}
...
{% endblock %}

当我运行以下命令时:

from jinja2 import Environment, PackageLoader

env = Environment(loader = PackageLoader('mailwrapper','mail_templates'))


template = env.get_template('mail.html')
template.render()

我只使用mail.html的html获取输出,但忽略子块,而只打印出空行。我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

要将内容导入 head 正文页脚块,您应该呈现 head.html 模板或 body.html footer.html 。当您执行 head.html 模板时,它会使用 mail.html 模板并用内容替换这些块。另一方面,当您呈现 mail.html 模板时,模板不知道应该替换块的 head.html (或其他)模板内容。

请考虑以下示例。

<强> mail.html

<html>
   <body>
    {% block head %}
    {% endblock %}
   </body>
</html>

<强> head.html:

{% extends "mail.html" %}
{% block head %}
Hello Email Head
{% endblock %}

<强> mailwrapper.py:

from jinja2 import Environment, PackageLoader
env = Environment(loader = PackageLoader('mailwrapper','mail_templates'))

template = env.get_template('head.html')
print(template.render())

>>> <html>
>>>   <body>
>>>     Hello Email Head
>>>   </body>
>>> </html>

template = env.get_template('mail.html')
print(template.render())

>>> <html>
>>>   <body>
>>>     
>>>   </body>
>>> </html>

我建议使用1个主要 mail.html 模板,其中包含3个块和一些扩展 mail.html 模板的其他模板,替换所有3个块中的内容。例如

<强> friendly_mail.html:

{% extends "mail.html" %}
{% block head %}
  Dear ...,
{% endblock %}

{% block body %}
  You have a good day.
{% endblock %}

{% block footer %}
  Sincerely,
    ...
{% endblock %}