Das Passwort-Widget aus Django Newforms zeigt bei einer erneuten Ausgabe den Formulares den Inhalt wieder an. Das ist zum einen sicherheitskritisch: in einem ungünstigen Fall könnte ein Dritter die Daten des Formulares erkunden und das Passwort sehen (Der Wert eines Passwort-Feldes ist im HTML-Quelltext klar zu sehen), zum anderen soll der User sowieso beide Passwörter neu eingeben.
Als Beispiel dient dieses einfache Registrierungsformular:
class RegistrationForm(forms.Form):
name = forms.CharField(label='Name')
password = forms.CharField(label='Passwort', widget=forms.PasswordInput)
password_confirm = forms.CharField(label='Passwort (Bestätigung)', widget=forms.PasswordInput)
# Prüfe hier, ob überhaupt korrekte Passwörter eingegeben wurden
# def clean_password(self):
# ... bspw. auf mindestens 8 Zeichen prüfen, wovon mindestens 1 Ziffer dabei ist
def clean(self):
if self.cleaned_data.get('password') != self.cleaned_data.get('password_confirm'):
raise forms.ValidationError('Die beiden Passwörter müssen identisch sein')
return self.cleaned_data
Angenommen wir klicken einmal auf den Submit-Button so würde das Formular (da in unserem Fall die Passwörter nicht identisch sind) wieder angezeigt:
Das Passwort wird wieder angezeigt.
Das PasswordInput-Widget bietet aber eine (nicht dokumentierte?) Funktion, den Inhalt des Feldes nicht mehr, genauer gesagt: nie, anzeigen zu lassen. Füge dem Wigdet das Attribut render_value=False hinzu und das Passwort-Feld ist bei jedem Rendern des Formulares leer.
Beispiel:
class RegistrationForm(forms.Form):
name = forms.CharField(label='Name')
password = forms.CharField(label='Passwort', widget=forms.PasswordInput(render_value=False))
password_confirm = forms.CharField(label='Passwort (Bestätigung)', widget=forms.PasswordInput(render_value=False))
# ...