我正在构建一个与数据库接口的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步,但我愿意接受建议。任何帮助表示赞赏。
答案 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)