2009-12-09 6 views
7

Estoy intentando validar un formulario (y antes funcionaba). Por alguna razón, parece que no puedo obtener las diversas funciones de limpieza como clean_username (self) para llamar cuando se llama a form.is_valid().formulario Django no llamando clean_ <fieldname>

Sé que no son casi suficientes cheques sin embargo (que están en construcción que se ve ;-)), pero aquí están mis clases:

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 

Gracias!

Respuesta

25

Descubrí el origen del error después de sumergirme en la fuente Django forms.py.

Parece que si un campo se deja en blanco, el formulario genera un ValidationError para ese campo después de llamar al field.clean(), pero luego no llama al clean_<fieldname>, pero todavía llama al método de limpieza principal de la clase. Con el fin de hacer frente a un método limpio que utiliza esos campos en blanco que tiene que hacer lo siguiente:

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 para excavar en forms.py. Me sorprende cómo las personas no verán el código fuente disponible. – cethegeek

+1

Puede ser aterrador. Tengo miedo de cambiar accidentalmente y guardar algo importante. Irracional, sé cuando todo se puede reemplazar fácilmente. ;-) – SapphireSun

7

Puede cambiar este comportamiento usando required=False en sus constructores de campo.

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

Esto parece ilógico por su ejemplo, pero puede ser útil si otros casos

Cuestiones relacionadas