在Django的TextField中禁用HTML转义

时间:2010-01-17 09:37:30

标签: html django django-models textfield

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

3 个答案:

答案 0 :(得分:85)

只需使用django的safe过滤器即可。在您的模板中,您可以执行以下操作:

{{ instance.my_text_field|safe }}

答案 1 :(得分:16)

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

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 }}

答案 2 :(得分:0)

我认为更好的方式就像@Daniel Vassallo所描述的那样。

为什么?

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

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

下面:

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解决方案。