2017-06-25 2 views
2

Wenn ich fertig bin, geben Sie meinen Benutzernamen und das Passwort ein, dieser Fehler ist explodieren, er schreibt, dass Benutzername und Passwort nicht übereinstimmten, aber alle Daten sind valide und wahr! wie man es repariert? Wie überprüft man das Passwort, wenn das Passwort in der Datenbank in verschlüsselter Form gespeichert ist, und das mitgelieferte Passwort in Form eines Strings!wie man Formen Passwort-Validierung zu beheben, Passwort nicht übereinstimmte

Vielen Dank für Ihre Hilfe, ich werde mich auf Ihren Rat freuen!

forms.py

class UserLogInForm(forms.Form): 
    username = forms.RegexField(regex=r'^\w+$', widget=forms.TextInput(attrs=dict(required=True, max_length=30)), label=_("Username"), error_messages={ 'invalid': _("This value must contain only letters, numbers and underscores.") }) 
    password = forms.CharField(widget=forms.PasswordInput(attrs=dict(required=True, max_length=30, render_value=False)), label=_("Password")) 

def clean_username(self): 
    user = User.objects.get(username__iexact=self.cleaned_data['username']) 
    if user: 
     return self.cleaned_data['username'] 
    else: 
     raise forms.ValidationError('This user does not exist!') 

def clean(self): 
    username = self.cleaned_data['username'] 
    password = self.cleaned_data['password'] 
    user = User.objects.filter(username=username) 
    if user.count() == 1: 
     user = user.first() 
     if user.check_password(password): 
      raise forms.ValidationError("Incorrect password!") 
     return self.cleaned_data 
    else: 
     raise forms.ValidationError('This user does not exist!') 

views.py

def login_view(request): 
    form = UserLogInForm(request.POST or None) 
    if form.is_valid(): 
     username = form.cleaned_data['username'], 
     password = form.cleaned_data['password'], 

     user = authenticate(request, username=username, password=password) 
     if user is not None: 
      login(request, user) 
      return redirect('/') 
     else: 
      return redirect('accounts/login') 
    context = {'form':form} 
    return render(request, 'accounts/registration/login.html', context) 

Antwort

1

Sie heben den Fehler, wenn die check_password() gibt Wahr zurück.

Ich schlage vor, Sie können das Verfahren so etwas wie diese neu schreiben,

def clean(self, *args, **kwargs): 
    username = self.cleaned_data.get("username") 
    password = self.cleaned_data.get("password") 
    try:    
     user = User.objects.get(username=username) 
    except User.DoesNotExist: 
     raise forms.ValidationError("This user does not exist!") 
    if user and not user.check_password(password): 
     raise forms.ValidationError("Incorrect password!"): 
    if user and not user.is_active: 
     raise forms.ValidationError("This user is no longer active.") 
    return super(UserLogInForm, self).clean(*args, **kwargs) 

Auch die nachgestellten Kommas aus diesen Zeilen in der Ansicht entfernen,

username = form.cleaned_data['username'] 
password = form.cleaned_data['password'] 

Aufgrund des Hinter Komma, Python gibt ein Tupel und keine Zeichenfolge zurück.

+0

Ich kann Ihre Antwort nur nach 6 Minuten akzeptieren, aber ich habe 1 Frage, alles läuft gut, aber autorisierte mich nicht –

+0

Darf ich vorschlagen eine größere Änderung in Ihrer sauberen Methode? – zaidfazil

+0

Natürlich werde ich nur glücklich sein) –

Verwandte Themen