32

当我写入模型的 TextField 时,如何关闭 Django 的自动 HTML 转义?

4

3 回答 3

90

只需使用 django 的安全过滤器。在您的模板中,您将执行以下操作:

{{ instance.my_text_field|safe }}
于 2010-02-15T17:54:14.143 回答
19

一种方法是在模型中放置一个函数,该函数返回标记为安全的数据:

from django.utils.safestring import mark_safe 

class MyModel(models.Model): 
    my_textfield = models.TextField()

    def display_my_safefield(self): 
        return mark_safe(self.my_textfield)

然后在模板中你必须使用:

{{ instance.display_my_safefield }}
于 2010-01-17T09:43:21.140 回答
-1

我认为更好的方法是@Daniel Vassallo 描述的那样。

为什么?

因为这样,您可以对要显示的 HTML 代码进行一些安全操作,而无需转义,尤其是防止跨站脚本 ( XSS )。

例如,您可以检查是否my_textfield包含脚本标记。
如果是这样,则将该实例标记为恶意并返回(正常 Django 行为) 的转义版本。否则,使用返回标记为安全的 HTML 代码。my_textfield
mark_safe

这里:

from django.utils.safestring import mark_safe 

class MyModel(models.Model): 
    my_textfield = models.TextField()
    is_malisious = models.BooleanField(default=False)

    def display_my_safefield(self):
        if '<script>' in self.my_textfield:
            self.is_malicious = True
            self.save()
            return self.my_textfield
        return mark_safe(self.my_textfield)

而这一切都不需要任何迁移到数据库。

替代方法

我认为您可以通过覆盖save()模型的方法来执行此安全操作,并包括针对其中的恶意内容的检查和任何其他必要的操作。然后,如果您确保任何保存的内容是安全的,您可以使用@bjunix 解决方案。

于 2017-10-27T12:59:18.590 回答