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 管理界面确实是该框架的一个令人惊叹的功能,我认为其他人可能也遇到了无法进行更高级验证的问题,因此它也会对他们有所帮助。
您已经创建了一个模型表单,但尚未告诉 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)