如何使用Django模型将XML安全文本数据保存到DB?

时间:2012-10-19 23:25:13

标签: django django-models django-forms escaping

我正在构建一个与数据库接口的Django站点,该数据库只能保存XML安全数据。像“Mike& Ike”这样的字符串需要存储为“Mike& amp; Ike”

从我所看到的有两种方法。在验证表单时,我可以将字符串转换为XML安全字符串。对于每个可以包含文本数据的字段,我必须在适当的验证函数中调用xml.sax.saxutils.escape。此外,在将DB模型的初始数据提供给我的表单对象时,我必须使用django.utils.safestring.mark_safe函数将字符串标记为安全(模板过滤器,如 | safe autoescape off 在这里没有帮助,因为form的html输出会自动转义所有值。)

class NameForm(forms.Form):
    name = forms.CharField()

    def clean_name(self):
        from xml.sax.saxutils import escape
        return escape(self.cleaned_data['name'])

from django.utils.safestring import mark_safe
form = NameForm(initial={'name': mark_safe(Customer.objects.get(pk=1).name)})

这种方法有不利之处。 escape d后,字符串可能会发生很大变化。另外,我必须记住将所有初始值标记为安全。我认为更好的方法是在数据库保存时,在将值写入数据库之前转义值。它允许我将任何值直接分配给模型对象,而不用担心转义它们。此外,当从c = Customer.objects.get(pk=1)等数据库中查找对象时,值c.name应该是未转义的值。例如:

c = Customer(id=1, name="Mike & Ike")
c.full_clean() # "test drive" escaping here and make sure it does not cause field overflow
c.save()
# database now have
# CUSTOMER
# NAME: 'Mike & Ike'
c1=Customer.objects.get(pk=1)
c1.name # Mike & Ike
c.name  # Mike & Ike

这可能吗?我从哪里开始?我已阅读Django documentation,它讨论了保存数据时所执行的步骤,但没有关于如何自定义该行为的指南。我想我想自定义那里提到的第3步,但我愿意接受建议。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您可以创建自定义save()方法并将其转义

https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-model-methods

e.g。

def save(self, *args, **kwargs):
    self.name = clean_name(self.name)
    super(NameForm, self).save(*args, **kwargs)