1

好的,所以我有 UserUpdateForm 和 RegistrationForm。目前每个都有这个功能:

def clean_email(self):
    email = self.cleaned_data.get('email')

    if email and User.objects.filter(email=email).exclude(pk=self.instance.id).count():
        raise forms.ValidationError('Email already in use.')
    return email

我想知道避免这种重复的理想方法是什么。

请指教。

** 更新 **

如果我需要调用父函数但所有一些东西,说我有这个怎么办:

def clean_email(self):
    email = self.cleaned_data.get('email')

    if email and User.objects.filter(email=email).exclude(pk=self.instance.id).count():
        raise forms.ValidationError('Email already in use.')

    ### THIS BIT IS ONLY NEEDED IN ONE OF THE CHILD FORMS ###
    # Check whether the email was change or not
    if self.instance.email != email:

        # To not change the email in our database until the new one is verified
        return self.instance.email
    ###

    return email
4

4 回答 4

1

使用信号例如:

 models.py

 @receiver(pre_save, sender=User)
 def User_pre_save(sender, **kwargs):
     email = kwargs['instance'].email
     username = kwargs['instance'].username

     if not email: raise ValidationError("email required")
     if sender.objects.filter(email=email).exclude(username=username).count(): raise ValidationError("email is already exist")      

视图.py

 def view_name(request):
     try:
          .......
     except ValidationError, e:
        message_dict = e.update_error_dict({})
        state = message_dict[NON_FIELD_ERRORS] 
 return render(request, 'page.html', {'state':state}) 
于 2013-01-28T03:07:15.357 回答
1

您可以创建一个具有该功能的基本表单,然后让两种表单都扩展该功能。

于 2013-01-28T03:22:00.537 回答
1

从基本形式继承(如其他答案所示),或者由于该形式是从您的模型派生的,您可以直接将其放入模型清理中。这种方法的唯一问题是它每次都会访问数据库。只是向您展示选项。

...在进行任何唯一性检查之前,将调用模型的 clean() 方法。有关模型的 clean() 挂钩的更多信息,请参阅验证对象。

class MyModel(models.Model):
   # ... your model
   def clean(self):
        if self.email and User.objects.filter(email=self.email).exclude(pk=self.id).count():
        raise ValidationError('Email already in use.')
于 2013-01-28T04:20:57.877 回答
1

扩展 msc 的答案,创建一个基本表单并拥有UserUpdateFormRegistrationForm扩展您的基本表单。

class YourBaseForm(ModelForm):

    def clean_email(self):
        email = self.cleaned_data.get('email')

        if email and User.objects.filter(email=email).exclude(pk=self.instance.id).count():
            raise forms.ValidationError('Email already in use.')
        return email

class UserUpdateForm(YourBaseForm):

    # ....add unique fields or methods here

class RegistrationForm(YourBaseForm):

    # ....add unique fields or methods here

clean_email方法现在可以在UserUpdateFormRegistrationForm对象上使用。

有关表单继承的更多信息,请查看文档。

更新:

如果您需要更改子类中的方法,那么您可以覆盖它,但包括对super方法的调用,clean_email如下所示 -

UserUpdateForm(YourBaseForm):

    def clean_email(self):
        email = super(UserUpdateForm, self).clean_email()
        if self.instance.email != email:
            return self.instance.email
        return email
于 2013-01-28T07:23:31.357 回答