modelform: override clean method

rom picture rom · Aug 22, 2013 · Viewed 19.3k times · Source

I have two questions concerning the clean method on a modelform. Here is my example:

class AddProfileForm(ModelForm):
        ...
        password = forms.CharField(max_length=30,widget=forms.PasswordInput(attrs={'class':'form2'}))
        password_verify = forms.CharField(max_length=30,widget=forms.PasswordInput(attrs={'class':'form2'}), label='Retype password')
        ...

        class Meta:
            model = UserModel
            fields=("username", "password", "password_verify", "first_name", "last_name", "date_of_birth", "biography", "contacts", )

        #called on validation of the form
        def clean(self):
            #run the standard clean method first
            cleaned_data=super(AddProfileForm, self).clean()
            password = cleaned_data.get("password")
            password_verify = cleaned_data.get("password_verify")

            #check if passwords are entered and match
            if password and password_verify and password==password_verify:
                print "pwd ok"
            else:
                raise forms.ValidationError("Passwords do not match!")

            #always return the cleaned data
            return cleaned_data
  1. Should I always call the standard clean method?

    cleaned_data=super(AddProfileForm, self).clean()
    
  2. Should I always return the cleaned_data variable?

    return cleaned_data
    

Answer

Rohan picture Rohan · Aug 22, 2013

For 1, Yes, if you want to make use of parent class's validators. See this explanation on the doc.

Warning

The ModelForm.clean() method sets a flag that makes the model validation step validate the uniqueness of model fields that are marked as unique, unique_together or unique_for_date|month|year.

If you would like to override the clean() method and maintain this validation, you must call the parent class’s clean() method.

For 2, yes, if data validates properly. Otherwise raise validation error.