Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Django模型将XML安全文本数据保存到DB?_Django_Django Models_Django Forms_Escaping - Fatal编程技术网

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

如何使用Django模型将XML安全文本数据保存到DB?,django,django-models,django-forms,escaping,Django,Django Models,Django Forms,Escaping,我正在构建一个Django站点,该站点与本应只保存XML安全数据的数据库接口。像“Mike&Ike”这样的字符串需要存储为“Mike&Ike” 据我所见,有两种方法。验证表单时,我可以将字符串转换为XML安全字符串。对于每个可以包含文本数据的字段,我必须在适当的验证函数中调用xml.sax.saxutils.escape。此外,当从DB模型向我的表单对象提供初始数据时,我必须使用django.utils.safestring.mark|u safe函数将字符串标记为safe(模板过滤器如|saf

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

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

这种方法有缺点。在执行
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

可能吗?我从哪里开始?我读过,它谈到了在保存数据时所执行的步骤,但没有关于如何自定义该行为的指南。我想我想定制上面提到的步骤3,但我愿意接受建议。非常感谢您的帮助。

您可以创建一个自定义的
save()
方法并将其转义到那里

e、 g


我想保存在模型中,独立于表单。我想尽可能晚地逃跑,就在救人之前。另外,我希望DB中的值在加载到模型中时自动取消扫描……据我所知,就是这样。我不清楚您认为在调用重写的save和超级save之间会发生什么……在调用NameForm.is\u valid()时,将自动调用我的示例中的clean\u name方法。我也不使用ModelForms,所以没有保存功能。这是一个老问题,但我相信@Colleen给了你想要的。不要将
clean*
方法放在表单中,将它们放在模型中,然后在模型的save()覆盖中调用它们,正如她所演示的那样。您可能需要调用
clean
full\u clean
。您的用例在Django文档中:我同意这种方法,但我可以看到一个问题:a)您将此绑定到正在执行验证的表单,b)转义函数更改值,使其不再验证。例如,
name=models.CharField(max_length=10)
然后
form.name='hi'
,在尝试保存之前转义将变成21个字符。
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
def save(self, *args, **kwargs):
    self.name = clean_name(self.name)
    super(NameForm, self).save(*args, **kwargs)