Django 管理中的自定义 M2M 验证未向用户显示

我有一个模型,我需要在其中验证 m2m 字段和常规字段是否互斥。(即您只能拥有其中之一,而不能同时拥有两者。)


class EventFrequency(models.Model):

    weekdays = models.CharField(...)

    dates = models.ManyToManyField(...)

由于一个是 m2m,覆盖模型save()不起作用。(保存模型,然后添加m2m)


我能够通过覆盖在管理类中成功抛出错误save_related(),但它不会显示在管理表单中。这只是一个常规的服务器错误。


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)

我究竟做错了什么?


RISEBY
浏览 89回答 0
0回答

慕桂英4014372

如何创建一个预保存信号并在其中包含验证逻辑,以便您可以以这种方式引发验证错误?https://docs.djangoproject.com/en/3.0/ref/signals/#pre-save另一个想法为管理员指定自定义 ModelForm 并覆盖该表单上的 clean 怎么样?Django 管理中的自定义验证
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python