当我写入模型的TextField时,如何关闭Django的自动HTML转义?
答案 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解决方案。