代码之家  ›  专栏  ›  技术社区  ›  OneMatzo

未调用修改的Django admin clean()方法

  •  2
  • OneMatzo  · 技术社区  · 7 年前

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

    我已经准备好了模型验证器,可以很好地工作,但是为了做更复杂的验证,我正在尝试覆盖admin中的clean()方法。py公司

    我的管理员。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)

    模型。提供程序模型的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)
    

    问题是代码显示在管理员中。py似乎没有启动,您可以将结束日期保存在开始日期之前。

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

    3 回复  |  直到 7 年前
        1
  •  5
  •   Alasdair    7 年前

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

    form 到您的模型表单:

    class ProviderAdmin(admin.ModelAdmin):
        form = ProviderForm
    

    然后在模型管理类中注册模型:

    admin.site.register(Provider, ProviderAdmin)
    
        2
  •  1
  •   schrodingerscatcuriosity kmahankali    7 年前

    您应该将super()int调用为clean方法:

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

    编辑:

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

    只有当您的表单继承了另一个不具有相关性的表单时,这才是相关的 在clean()方法中返回一个clean_数据字典。此外,如果 您使用的是python 3,不需要参数

        3
  •  0
  •   scharette    7 年前

    考虑到缩进只是发布代码的问题,我猜想您忘记重写admin类了。以下是您需要做的:

    class ProviderAdmin(admin.ModelAdmin):
        form = ProviderForm
    
    
    admin.site.register(Provider,ProviderAdmin)
    

    您所走的路是对的,只是忘记了通过使用 clean 推翻