Django管理中的自定义M2M验证没有显示给用户



我有一个模型,需要验证m2m字段和正则字段是否是互斥的。(也就是说,你只能有一个或另一个,而不能两者都有。(

class EventFrequency(models.Model):
weekdays = models.CharField(...)
dates = models.ManyToManyField(...)

由于其中一个是m2m,因此重写模型save()不起作用。(保存模型,然后添加m2m(

通过重写save_related(),我可以在admin类中成功抛出错误,但它不会显示在admin表单中。这只是一个常规的服务器错误。

class EventFrequencyAdmin(VersionAdmin, admin.ModelAdmin):
model = EventFrequency
filter_horizontal = ('dates',)
def save_related(self, request, form, formsets, change):
super(EventFrequencyAdmin, self).save_related(request, form, formsets, change)
if form.instance.dates.exists() and form.instance.weekdays:
raise ValidationError('Cannot select both dates and weekdays.')

我能够通过重写changeform_view()来捕捉错误,并尝试将其显示给用户。除了重定向之外,它似乎工作得很好。form_url没有值,因此是''

def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
try:
return super(EventFrequencyAdmin, self).changeform_view(request, object_id, form_url, extra_context)
except ValidationError as e:
print('************* caught error *************')
self.message_user(request, e, level=messages.ERROR)
return HttpResponseRedirect(form_url)

我做错了什么?

创建一个预保存信号并在其中设置验证逻辑,以便以这种方式引发验证错误,怎么样?

https://docs.djangoproject.com/en/3.0/ref/signals/#pre-保存

另一个想法

为管理员指定一个自定义ModelForm并覆盖该表单上的clean怎么样?

Django管理中的自定义验证

相关内容

最新更新