修改后的 Django admin clean() 方法没有被调用

One*_*tzo 3 python django django-models django-admin

我开发了一个基于 Django 管理站点的工具(内部使用)。

我有模型验证器,它工作得很好,但是为了进行更复杂的验证,我试图覆盖 admin.py 中的 clean() 方法

我的 admin.py 看起来像这样:


from django.contrib import admin
from .models import Provider, Employer, Person, Learnership, Qualification, Unit_Standard
from django import forms

class ProviderForm(forms.ModelForm): class Meta: model = Provider fields = 'all'

    def clean(self):
        provider_start_date = self.cleaned_data.get('provider_start_date')
        provider_end_date = self.cleaned_data.get('provider_end_date')
        if provider_start_date > provider_end_date:
            raise forms.ValidationError("Start date can't be after end date")
        return self.cleaned_data
Run Code Online (Sandbox Code Playgroud)

admin.site.register(Provider)

Run Code Online (Sandbox Code Playgroud)

提供者模型的 models.py:


class Provider(models.Model):
    ... lots of stuff here ...
    provider_start_date = models.DateField()
    provider_end_date = models.DateField(blank=True, null=True)
    ... lots of stuff here ...

    def __str__(self):
        return '%s %s' % (self.provider_name, self.provider_code)
Run Code Online (Sandbox Code Playgroud)

问题是 admin.py 中显示的代码似乎没有触发,您可以保存结束日期早于开始日期的记录。

Django 管理界面确实是该框架的一个令人惊叹的功能,我认为其他人可能也遇到了无法进行更高级验证的问题,因此它也会对他们有所帮助。

Ala*_*air 5

您已经创建了一个模型表单,但尚未告诉 Django 使用它。

您应该创建一个模型管理员,并设置form为您的模型表单:

class ProviderAdmin(admin.ModelAdmin):
    form = ProviderForm
Run Code Online (Sandbox Code Playgroud)

然后向模型管理类注册您的模型:

admin.site.register(Provider, ProviderAdmin)
Run Code Online (Sandbox Code Playgroud)