2013-02-26 10 views
14

robię postać login/hasło:Django. Komunikat o błędzie do formularza logowania

model:

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

zobacz:

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}) 

URL:

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

szablon:

{% 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> 

Używam przekierowania do strony logowania, a następnie login lub hasło jest nieprawidłowe, ale chcę w tym przypadku wygenerować komunikat o błędzie. Dlaczego konstrukcja {% if form.errors%} nie działa? Dzięki!

+2

Żadna forma jest renderowany w swój 'HttpResponseRedirect'. – arulmr

+0

użyj formularza, aby uruchomić form.errors – catherine

Odpowiedz

43

Ponieważ formularz nie ma pojęcia, że ​​wystąpił błąd.

Kiedy zbudować formę tutaj:

form=LoginForm() 

Ty konstruowaniem bez przekazując mu żadnych informacji. Nie wie nic o POST, który właśnie zrobił użytkownik, ani o tym, że logowanie się nie powiodło lub że zabrakło hasła lub jakikolwiek był błąd.

Oto co moje formularze logowania wyglądać następująco:

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 

nam przesłonić clean metodę formie, dlatego, że jeśli postać przechodzi walidację możemy sprawdzić poświadczenia użytkownika. Wprowadzamy również metodę logowania do samego obiektu formularza, aby nasz widok był czystszy.

Następny, naszym zdaniem, chcemy to zrobić:

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 }) 

Mamy instancję formularz i przekazać go do request.POST do sprawdzenia przeciw.

Jeśli mamy POST, sprawdzamy, czy formularz jest ważny. Metoda "czysta" formularza zostanie wywołana i sprawdź poświadczenia użytkownika dla nas.

Jeśli poświadczenia nie powiodą się, zgłaszany jest błąd, który musimy wyświetlić w naszym szablonie.

Błędy zgłaszane przez formularz (nie dołączony do pola) są przechowywane w non_field_errors, które mogą być wyświetlane tak:

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

Gdy przekierowujesz, nie jestem pewien, czy wysyłasz kontekst strony. Więc kiedy przekierowujesz do strony/login /, django tinks to nowy formularz, który jest ładowany.