0

我正在使用 CRUD 管理视图来编辑一些文本。我之前覆盖了save()我的模型的方法来运行一些验证。也就是说,如果输入字符串不是格式正确的 xml,则不会保存它。我想通知用户。但是,我只能找到需要请求对象和消息框架的解决方案,但就我而言,我无法requestsave()

def save(self, *args, **kwargs):
    try:
        from xml.dom.minidom import parseString
        doc = parseString(self.content)
        super(Screen, self).save(*args, **kwargs)
    except Exception, e:
        from django.contrib import messages
        # messages.error(request, "This is a bad bad message")
        print("this is a bad bad string")
        return

如何发送错误消息?点击“保存”后,用户再次被重定向到该模型的实例列表。有没有办法将其重定向到表单?这些问题有关系吗?

4

2 回答 2

1

我认为您可以在模型中使用 clean 方法,这样您将在管理员中验证您的数据,就像其他管理员字段一样

在你的内部Model

def clean(self):
   try:
        from xml.dom.minidom import parseString
        doc = parseString(self.content)

    except Exception, e:
        from django import forms
        raise forms.ValidationError(u"It's not a XML")

    super(YourModel,self).clean()

def full_clean(self, exclude=None):
    return self.clean()

参考:https ://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.clean_fields

于 2013-04-17T15:39:10.997 回答
0

感谢@FernandoFreitasAlves,我可以写一个解决方案。我意识到我的模型也可以从文件中加载然后存储在数据库中,而无需 CRUD 管理页面,因此我也覆盖了该save()方法。

def save(self, *args, **kwargs):
    xml = "<screen>" + self.content + "</screen>"
    parseString(xml.encode("utf-8"))
    super(Screen, self).save(*args, **kwargs)

def clean(self):
    try:
        from xml.dom.minidom import parseString
        doc = parseString(self.content)
    except Exception, e:
        from django import forms
        raise forms.ValidationError("It's not a XML")
    super(Screen,self).clean()

我想我不想超越这个full_clean()方法。我看不出有什么理由。文档(https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.full_clean)说

此方法按此顺序调用 Model.clean_fields()、Model.clean() 和 Model.validate_unique(),并引发一个 ValidationError,它的 message_dict 属性包含来自所有三个阶段的错误。

于 2013-04-18T11:11:19.837 回答