我正在使用CRUD管理员视图来编辑一些文本。
我覆盖了模型的save()
方法,以便之前运行一些验证。也就是说,如果输入字符串不是格式良好的xml,则不会保存它。我想通知用户。
但是,我只能找到需要请求对象和消息框架的解决方案,但就我而言,我无法从request
访问save()
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
如何发送错误讯息? 点击“保存”后,用户将再次重定向到该模型的实例列表。有没有办法将其重定向到表单?这些问题有关系吗?
答案 0 :(得分: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
答案 1 :(得分: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属性包含所有三个错误 阶段。