[英]Django pre_save signal and ModelAdmin custom error message
我有一个模型,其 pre_save() 信号通过以下方式连接到删除服务(json、REST 等):
错误响应格式如下:
{'local_model_field': [u'This element already exists']}
本地模型 pre_save 信号然后引发ValidationError
:
raise ValidationError(json_response['local_model_field'][0])
这很好用。
现在,在 django 管理员上,当我尝试模拟远程插入一个已经存在的对象时,我得到一个 500 页,这很好但并不理想。
有没有办法让 pre_save() 错误气泡一直到ModelAdmin
并显示为标准错误消息,并填充相关内容?
我尝试了以下但无济于事:
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
"""
trying to display the right message when pre_save() fails on model save() method (after asking CC)
"""
try:
return super(ObjectAdmin, self).changeform_view(request, object_id, form_url, extra_context)
except IntegrityError as e:
self.message_user(request, e, level=messages.ERROR)
return HttpResponseRedirect(form_url)
ValidationError
是正确的做法吗? 知道pre_save()
必须锁定任何以本地和远程重复结尾的机会。 主要原因是本地/远程对象创建可以由管理员进行,也可以从其他网站实例/类型(例如,前端、面向最终用户)进行。
谢谢
不确定这是否仍然相关。 但我解决这个问题的方法是创建一个 ModelForm:
class AuthorAdminForm(forms.ModelForm):
def clean(self):
# or some api calls here
if self.instance.id > 4:
self.instance.name = "4+"
else:
ValidationError("Id is bigger that 4")
return super().clean()
然后通过将表单添加到管理模型:
class AuthorAdmin(admin.ModelAdmin):
form = AuthorAdminForm
这个clean()
方法将确保您可以在点击模型save()
方法之前添加/修改字段,并且如果在点击 url 时出现404
错误等问题,仍然会抛出ValidationError
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.