当我写入模型的 TextField 时,如何关闭 Django 的自动 HTML 转义?
问问题
18527 次
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 回答