2009-12-09 5 views
7

Ich versuche ein Formular zu validieren (und es früher zu arbeiten). Aus irgendeinem Grund kann ich nicht scheinen, die verschiedenen Reinigungsfunktionen wie clean_username (self) aufgerufen zu bekommen, wenn form.is_valid() aufgerufen wird.Django Formular nicht aufrufen clean_ <fieldname>

ich dort kenne, sind nicht annähernd genug Kontrollen noch (sie sind im Bau Sie sehen ;-)), aber hier sind meine Klassen:

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 

Thank you!

Antwort

25

Ich entdeckte die Quelle des Fehlers nach dem Tauchen in die Quelle Django forms.py.

Es scheint, dass, wenn ein Feld leer ist, das Formular ein Validation für das Feld wirft nach field.clean() Aufruf, aber dann ist es nicht clean_<fieldname> nennen, aber es ruft nach wie vor das Haupt saubere Methode der Klasse. Um mit einem sauberen Verfahren zu beschäftigen, die diese leeren Felder verwendet, müssen Sie folgendes tun: durch die Verwendung required=False in Ihrem Bereich Konstrukteuren

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 für das Graben in forms.py nützlich sein. Es erstaunt mich, wie die Leute nicht in den verfügbaren Quellcode schauen. – cethegeek

+1

Es kann beängstigend sein. Ich habe Angst davor, versehentlich etwas Wichtiges zu ändern und zu speichern. Irrational, ich weiß wann das ganze Ding leicht ersetzt werden kann. ;-) – SapphireSun

7

Sie können dies außer Kraft setzen.

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

Das für Ihr Beispiel unlogisch erscheint, kann aber, wenn andere Instanzen