0

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

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

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)})

这种方法有缺点。字符串在escaped 之后可能会发生很大变化。另外,我必须记住将所有初始值标记为安全。我认为更好的方法是在数据库保存时转义值,就在值写入数据库之前。它可以让我直接将任何值分配给模型对象,而不必担心转义它们。此外,当从数据库中查找对象时,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 文档,它讨论了保存数据时执行的步骤,但没有关于如何自定义该行为的指南。我想我想自定义那里提到的第 3 步,但我愿意接受建议。任何帮助表示赞赏。

4

1 回答 1

0

您可以创建一个自定义save()方法并在那里转义它

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

例如

def save(self, *args, **kwargs):
    self.name = clean_name(self.name)
    super(NameForm, self).save(*args, **kwargs)
于 2012-10-19T23:29:35.083 回答