2009-12-09 16 views
7

Próbuję zatwierdzić formularz (i działał wcześniej). Z jakiegoś powodu nie mogę uzyskać różnych funkcji czyszczących, takich jak clean_username (self), aby uzyskać wywołanie, gdy wywoływana jest metoda form.is_valid().Formularz Django nie wywołuje funkcji clean_ <fieldname>

wiem, że nie są wystarczająco blisko sprawdza jeszcze (są w trakcie budowy można zobaczyć ;-)), ale tutaj są moje zajęcia:

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 

Dziękujemy!

Odpowiedz

25

Odkryłem źródło błędu po nurkowaniu w źródle Django forms.py.

Wygląda na to, że jeśli pole pozostanie puste, formularz wywołuje błąd sprawdzania poprawności dla tego pola po wywołaniu field.clean(), ale wówczas nie wywołuje clean_<fieldname>, ale nadal wywołuje główną czystą metodę klasy. W celu radzenia sobie z czystym metoda, która wykorzystuje te puste pola trzeba wykonać następujące czynności:

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 do kopania w forms.py. Zadziwia mnie to, jak ludzie nie zaglądają do dostępnego kodu źródłowego. – cethegeek

+1

To może być przerażające. Boję się przypadkowej zmiany i uratowania czegoś ważnego. Irracjonalne, wiem, kiedy wszystko można łatwo wymienić. ;-) – SapphireSun

7

Można to zmienić za pomocą required=False w swoich konstruktorów polowych.

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

Wydaje się nielogiczne dla przykładu, ale może być przydatna, jeśli inne przypadki

Powiązane problemy