2013-02-26 3 views
14

I Login/Passwort Formular:Django. Fehlermeldung für Login-Formular

Modell:

class LoginForm(forms.Form): 
username = forms.CharField(max_length=100) 
password = forms.CharField(widget=forms.PasswordInput(render_value=False),max_length=100) 

Ansicht:

def login_view(request): 
    if request.method == 'POST': 
     username = request.POST['email'] 
     password = request.POST['password'] 
     user = authenticate(username=username, password=password) 
     if user is not None and user.is_active: 
      login(request, user) 
      return HttpResponseRedirect("/n1.html")# Redirect to a success page. 
     return HttpResponseRedirect("/login") 
    form=LoginForm() 
    return render(request, 'enter.html', {'login_form': LoginForm}) 

Urls:

(r'^login/$', login_view), 

Vorlage:

{% if form.errors %} 
<p>Something is wrong</p> 
{% endif %} 

<form class="form-signin" action="" method="post"> 
    <h2 class="form-signin-heading">Login</h2> 
    {% csrf_token %} 

    <input class="input-block-level" type="text" name="email" value="" id="email" placeholder="Email"> 

    <input class="input-block-level" type="password" name="password" value="" id="username" placeholder="Password"> 

    <button class="btn btn-large btn-primary" type="submit">Login</button> 
    <input type="hidden" name="next" value="{{next|escape}}" /> 

</form> 

Ich benutze Redirect Login-Seite dann Login oder Passwort ist falsch, aber ich möchte in diesem Fall eine Fehlermeldung machen. Warum funktioniert die Konstruktion {% if form.errors%} nicht? Danke!

+2

Keine Form in Ihrem 'HttpResponseRedirect' gerendert wird. – arulmr

+0

Verwenden Sie das Formular zum Auslösen von form.errors – catherine

Antwort

43

Da das Formular keine Ahnung hat, ist ein Fehler aufgetreten.

Wenn Sie das Formular konstruieren hier:

form=LoginForm() 

Sie es konstruieren, ohne sie keine Informationen übergeben. Es weiß nichts über den POST, den der Benutzer gerade gemacht hat, oder dass die Anmeldung fehlgeschlagen ist oder dass das Passwort fehlt oder was auch immer der Fehler war.

Hier ist, was die Anmeldungsformulare wie folgt aussehen:

class LoginForm(forms.Form): 
    username = forms.CharField(max_length=255, required=True) 
    password = forms.CharField(widget=forms.PasswordInput, required=True) 

    def clean(self): 
     username = self.cleaned_data.get('username') 
     password = self.cleaned_data.get('password') 
     user = authenticate(username=username, password=password) 
     if not user or not user.is_active: 
      raise forms.ValidationError("Sorry, that login was invalid. Please try again.") 
     return self.cleaned_data 

    def login(self, request): 
     username = self.cleaned_data.get('username') 
     password = self.cleaned_data.get('password') 
     user = authenticate(username=username, password=password) 
     return user 

wir die clean-Methode des Formulars überschreiben, so dass, wenn die Formularvalidierung gibt wir die Anmeldeinformationen des Benutzers überprüfen. Wir haben auch eine Login-Methode auf das Formular-Objekt selbst angewendet, um unsere Ansicht sauberer zu machen.

nächste aus unserer Sicht wollen wir dies tun:

def login_view(request): 
    form = LoginForm(request.POST or None) 
    if request.POST and form.is_valid(): 
     user = form.login(request) 
     if user: 
      login(request, user) 
      return HttpResponseRedirect("/n1.html")# Redirect to a success page. 
    return render(request, 'enter.html', {'login_form': form }) 

Wir instanziiert das Formular aus und geben Sie ihm die request.POST gegen überprüfen.

Wenn wir einen POST haben, überprüfen wir, ob das Formular gültig ist. Die "saubere" Methode des Formulars wird aufgerufen und die Benutzeranmeldeinformationen für uns werden überprüft.

Wenn die Anmeldeinformationen fehlschlagen, wird ein Fehler ausgegeben, den wir in unserer Vorlage anzeigen müssen.

Fehler, die durch die Form angehoben (aber nicht auf ein Feld im Anhang) in non_field_errors gespeichert sind, die wie so angezeigt werden können:

{% if form.non_field_errors %} 
    <ul class='form-errors'> 
     {% for error in form.non_field_errors %} 
      <li>{{ error }}</li> 
     {% endfor %} 
    </ul> 
{% endif %} 
1

Wenn Sie umleiten, bin ich mir nicht sicher, dass Sie den Kontext Ihrer Seite senden. Wenn Sie also auf die Seite/login/umleiten, tastet django ein neues Formular ab, das geladen wird.