2009-12-09 3 views
7

J'essaye de valider un formulaire (et cela fonctionnait auparavant). Pour une raison quelconque, je n'arrive pas à obtenir les différentes fonctions de nettoyage telles que clean_username (self) pour être appelé quand form.is_valid() est appelé.Formulaire Django n'appelant pas clean_ <fieldname>

Je sais qu'il n'y a pas encore assez près contrôles (ils sont en cours de construction que vous voyez ;-)), mais voici mes classes:

class LoginForm(forms.Form): 
    username = forms.CharField(max_length=30) 
    password = forms.CharField(max_length=30,widget=forms.PasswordInput) 

    def clean_password(self): 
     print "Cleaning password" 
     password = self.cleaned_data['password'] 
     if password == u"": 
      raise forms.ValidationError("Password is blank.") 
     return password 

    def clean_username(self): 
     username = self.cleaned_data['username'] 
     if len(username) < 4: 
      raise forms.ValidationError("Username is fewer than four charecters.") 
     return username 


class RegistrationForm(LoginForm): 
     confirm_password = forms.CharField(widget=forms.PasswordInput, max_length=30) 
     email = forms.EmailField() 

     def clean_confirm_password(self): 
      print "Cleaning confirm password" 
      clean_confirm_password = self.cleaned_data['confirm_password'] 
      if clean_confirm_password == u"": 
       raise forms.ValidationError("Confirming password is blank.") 
      return clean_confirm_password 

     def clean(self): 
      print "Running clean on a registration form" 
      print self.cleaned_data.items() 
      password = self.cleaned_data['password'] 
      confirm = self.cleaned_data['confirm_password'] 
      if password != confirm: 
       raise forms.ValidationError('Passwords do not match.') 
      return self.cleaned_data 

Merci!

Répondre

25

J'ai découvert la source de l'erreur après avoir plongé dans la source Django forms.py.

Il semble que si un champ est laissé vide, le formulaire déclenche une erreur ValidationError pour ce champ après avoir appelé field.clean(), mais n'appelle pas clean_<fieldname>, mais il appelle toujours la méthode clean principale de la classe. Pour faire face à une méthode propre qui utilise les champs vides que vous devez faire ce qui suit:

def clean(self): 
    try: 
     password = self.cleaned_data['password'] 
     # etc 
    except KeyError: 
     raise ValidationError('The password field was blank.') 

    return self.cleaned_data 
+6

+1 pour creuser dans forms.py. Cela m'étonne que les gens ne regardent pas le code source disponible. – cethegeek

+1

Ça peut faire peur. J'ai peur de changer accidentellement et de sauver quelque chose d'important. Irrationnel, je sais quand tout peut être facilement remplacé. ;-) – SapphireSun

7

Vous pouvez corriger cela en utilisant required=False dans vos constructeurs de terrain.

username = forms.CharField(max_length=30, required=False) 
password = forms.CharField(max_length=30,widget=forms.PasswordInput, required=False) 

Cela semble illogique pour votre exemple, mais peut être utile si d'autres cas

Questions connexes