【问题标题】:Jinja2 for Flask not picking up child templatesFlask 的 Jinja2 没有拾取子模板
【发布时间】:2015-03-17 09:19:09
【问题描述】:

我正在尝试编写一个包含三个部分的电子邮件 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>

本质上是一个父模板和三个子模板,都在同一个目录中。子模板在以下两个标签之间进行了描述:

{% 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 的输出,但是子块被忽略并且只打印出空行。我在这里做错了什么?

【问题讨论】:

  • 这是完整的代码吗?您的 email_header 块未在 mail.html 中定义。
  • 对不起,它应该是 'head' 而不是 'email_header'。更新了它。 'head' 块已在名为 email_header.html 的文件中定义,该文件与 mail.html 位于同一目录中
  • 您应该 1) 在 mail.html 中包含 3 个文件而不是使用块,或者 2) 在扩展 mail.html 的单个文件中定义所有 3 个块并加载该模板
  • @VarunJain 如果您觉得答案有帮助,请将其标记为已接受;)

标签: python flask jinja2


【解决方案1】:

要将内容放入 headbodyfooter 块中,您应该渲染任一 head.html 模板或 body.htmlfooter.html。当您执行 head.html 模板时,它会使用 mail.html 模板并将块替换为内容。另一方面,当您渲染 mail.html 模板时,模板不知道应该用内容替换块的 head.html (或其他)模板。

考虑以下示例。

ma​​il.html

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

head.html:

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

ma​​ilwrapper.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 个主 ma​​il.html 模板和 3 个块和一堆扩展 ma​​il.html 模板的其他模板,替换所有 3 个块中的内容.例如

friendly_mail.html:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多