2013-08-22 17 views
10

Ho due domande relative al metodo clean su un modello. Ecco il mio esempio:: metodo clean override

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. Devo sempre chiamare il metodo pulito di serie?

    cleaned_data=super(AddProfileForm, self).clean() 
    
  2. Devo restituire sempre la variabile clean_data?

    return cleaned_data 
    

risposta

13

Per 1, Sì, se si desidera fare uso di validatori della classe genitore. Vedi questa spiegazione su doc.

Attenzione

Il metodo ModelForm.clean() imposta un flag che rende la fase di validazione del modello convalidare l'unicità dei campi del modello che sono contrassegnati come unici, unique_together o unique_for_date | mese | anno.

Se si desidera sovrascrivere il metodo clean() e mantenere questa convalida , è necessario chiamare il metodo clean() della classe genitore.

Per 2, sì, se i dati vengono validati correttamente. Altrimenti, aumenta l'errore di convalida.

+0

1/Quindi se non si chiama il metodo clean della classe genitore, gli altri campi non verranno convalidati? In tal caso, dovrebbe essere utile? (i campi devono sempre essere convalidati, non è così?) 2/Nel mio metodo pulito, può esserci un errore di convalida, ma restituisco clean_data comunque! È un modo sbagliato di fare? – rom

+1

@rom, i campi sono convalidati nel loro metodo 'field_clean()'. Il metodo 'clean()' serve per validare qualsiasi combinazione o più campi con valori relativi l'uno all'altro. – Rohan

+0

Ok quindi se rimuovo super (AddProfileForm, self) .clean() funziona ancora, no? O non controllerà i vincoli unique_together (per esempio)? – rom