Django模板不会逃脱HTML

时间:2017-11-02 15:18:23

标签: python html django

我有一个扩展django-mailbox电子邮件的模型。如果电子邮件采用文本格式,as_html()会将文本转换为html。 (它将文本包装在<pre>标签中。)

class EmailReply(models.Model):

    def as_html(self):
        if self.message.html:
            return self.message.html
        elif self.message.text:
            context = {
                'email': self.message.text
            }
            return mark_for_escaping(
                render_to_string(
                    APP_NAME+'/email/text_as_html.html',
                    context
                )
            )

    message = models.OneToOneField('django_mailbox.Message')

    ...

我想在一个html页面中显示多个电子邮件。我有一个迭代几个EmailReply对象的视图。我需要在iframe的srcdoc中包含html,而不是链接到消息。 (我正在将页面转换为PDF,并且转换器可以更好地将所有内容放在一个页面中。)

{% for email in emails %}
<div class="page">
    <ul>
        <li>Subject: {{ email.message.subject }}</li>
    </ul>
    <iframe srcdoc="{{ email.as_html|escape }}" frameBorder="0" scrolling="no" sandbox></iframe>
</div>
{% endfor %}

对于具有html组件的邮件,html将被转义:

<div class="page">
    <ul>
        <li>Subject: Example 1</li>
    </ul>
    <iframe srcdoc="&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;[...]" frameBorder="0" scrolling="no" sandbox></iframe>
</div>

但是,文本消息没有被转义:

<div class="page">
    <ul>
        <li>Subject: Example 2</li>
    </ul>
    <iframe srcdoc="
<!DOCTYPE html>
<html>
<head>
    <title>Email Reply</title>
    <meta charset="utf-8" />
</head>
<body>
[...]
</body>
</html>
" frameBorder="0" scrolling="no" sandbox></iframe>
</div>

我同时使用mark_for_escaping()escape模板过滤器,但是当输出是文本电子邮件时,它仍然没有被转义。为什么不呢?

(使用Django 1.10。)

0 个答案:

没有答案