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

时间:2017-11-01 13:35:47

标签: 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

admin.site.register(Provider)

提供者模型的models.py:

    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

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

Django管理界面实际上是框架的一个了不起的功能,我认为其他人可能也遇到了更高级验证无法实现的问题,所以它也会对它们有所帮助。

3 个答案:

答案 0 :(得分:3)

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

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

class ProviderAdmin(admin.ModelAdmin):
    form = ProviderForm

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

admin.site.register(Provider, ProviderAdmin)

答案 1 :(得分:0)

你应该在clean方法中调用super()int:

def clean(self):

    cleaned_data = super(ProviderForm, self).clean()

编辑:

这不是正确答案,@Alasdair上面是。正如@scharette在评论中指出的那样

  

仅当您的表单继承了另一个表单时才有意义   在clean()方法中返回cleaning_data字典。另外,如果   你正在使用python 3,不需要参数

答案 2 :(得分:0)

考虑到您的缩进只是发布代码的问题,我猜您忘记覆盖管理类。以下是您需要做的事情:

class ProviderAdmin(admin.ModelAdmin):
    form = ProviderForm


admin.site.register(Provider,ProviderAdmin)

通过使用clean覆盖

指定表单,您在正确的路径上忘记在管理类上注册覆盖