2010-12-17 4 views
2
class RegisterForm(forms.Form): 
    username = forms.CharField(max_length=16, label="Username", required=False) 
    password = forms.CharField(max_length=100,widget=forms.PasswordInput, required=False) 
    password2 = forms.CharField(max_length=100,widget=forms.PasswordInput, label="Password Again", required=False) 
    fullname = forms.CharField(max_length = 100, required=False) 
    email = forms.EmailField(max_length=100, required=False) 
    def clean_fullname(self): 
     if len(self.cleaned_data['fullname']) < 4: 
      raise forms.ValidationError("Enter your full name.") 
    def clean_email(self): 
     if self.cleaned_data['email'].find("@") <= 0: 
      raise forms.ValidationError("Enter a valid email address.") 
    def clean_username(self): 
     if not self.cleaned_data['username']: 
      raise forms.ValidationError("Enter a username.") 
     try: 
      u = User.objects.get(username = self.cleaned_data['username']) 
      if u: 
       raise forms.ValidationError("Username is taken.") 
     except: 
      pass 
    def clean_password(self): 
     if not self.cleaned_data['password']: 
      raise forms.ValidationError("Enter a password.") 
    def clean_password2(self): 
     if not self.cleaned_data['password2']: 
      raise forms.ValidationError("Enter your password (again)") 

    def clean(self): 
     cleaned_data = self.cleaned_data 
     password = cleaned_data['password'] <<< There is a key error here anytime I submit a form. 
     password2 = cleaned_data['password2'] 
     if password and password2: 
      if password != password2: 
       raise forms.ValidationError("Your passwords do not match.") 
     return cleaned_data 

Es gibt einen Schlüsselfehler auf S. assword = cleaned_data['password']Warum gibt es einen Schlüsselfehler in dieser Zeile meines Django-Formularcodes?

Antwort

2

Der Grund ist, weil Ihre clean_password Funktion nichts zurückgibt. Genauso wenig wie Ihr clean_password2

Dies ist die Reihenfolge der Validierung:

  1. clean_fieldnames
  2. sauber

clean_password und clean_password2 benötigen einen Wert zurückgeben, wenn sie gültig sind.

def clean_password(self): 
    if not self.cleaned_data['password']: 
     raise forms.ValidationError("Enter a password.") 
    return self.cleaned_data['password'] 

def clean_password2(self): 
    if not self.cleaned_data['password2']: 
     raise forms.ValidationError("Enter your password (again)") 
    return self.cleaned_data['password2'] 

obwohl das empfohlene Format ein paar Tastenanschläge zu speichern (vor allem bei längerer Validierung) ist ...

def clean_password2(self): 
    data = self.cleaned_data['password2'] 
     raise forms.ValidationError("Enter your password (again)") 
    return data 
2

Nun, die kurze wörtliche Antwort ist, dass self.cleaned_data ist ein dict, die keinen Eintrag mit ‚Passwort‘ als Schlüssel hat. Gehen Sie zur nächsten Stufe:

Haben Sie versucht, self.cleaned_data zu inspizieren? Fehlt nur ein password Eintrag oder ist dieser leer? Hast du ein Passwort in das Formular eingegeben? Was erwarten Sie in selb.cleaned_data, wenn nichts in das Formular eingegeben wurde? Was ist die Basis deiner Erwartung?

Ich halte es eher für suspekt, dass eine Methode, deren Name ein Aktionsverb wie "clean" ist, an einem Attribut mit dem Namen "cleaned_data" anstelle von "raw_data" oder "uncleaned_data" oder "unclean_data" oder "not_known_to_be_clean_data" arbeitet. Ist das deine Idee oder nur Django Seltsamkeit?

+0

Ja, mein cleaned_data ist leer. Weißt du, warum? – TIMEX

+0

Nein, ich weiß nicht warum. Wenn ich Zugriff auf Ihr System hätte und wüsste, wo ich die Django-Dokumente finden könnte, würde ich prüfen, ob alle von mir gelieferten Methoden den Anforderungen entsprechen. Hast du das gemacht? –

Verwandte Themen