我已经开发了一个基于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管理界面实际上是框架的一个了不起的功能,我认为其他人可能也遇到了更高级验证无法实现的问题,所以它也会对它们有所帮助。
答案 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
覆盖