【问题标题】:Custom M2M validation in Django admin not displaying to userDjango admin 中的自定义 M2M 验证未向用户显示
【发布时间】:2020-12-01 15:19:25
【问题描述】:

我有一个模型,我需要验证 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)

我做错了什么?

【问题讨论】:

    标签: python python-3.x django


    【解决方案1】:

    如何创建一个预保存信号并在其中包含您的验证逻辑,以便您可以通过这种方式引发验证错误?

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

    另一个想法

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

    Custom validation in Django admin

    【讨论】:

    • 如果可能的话,我更愿意避开这个信号。我真的只希望在管理表单中使用时引发此验证错误。我希望 pre_save 也不能与 m2m 一起使用......我相信你需要 m2m_changed。
    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多