2016-05-12 53 views
0

如果身份驗證失敗,我希望向用戶顯示一條錯誤消息,其中包含'無效的用戶名或密碼,請重試'以獲得django中的登錄表單,但是im不知道這樣做的最好方法是什麼。 我已經考慮設置一個上下文變量,它將被傳遞到模板中,然後我可以使用CSS將該消息與表單一起呈現。類似下面:顯示無效登錄詳細信息的最佳方式 - django表單

 if user is not None: 
      if user.is_active: 
       # Redirect to a success page. 
      else: 
       # Return a 'disabled account' error message 
     else: 
      form = LoginForm() 
      incorrect_login = True 
      context = ('incorrect_login': incorrect_login, 'form':form) 
      return render(request, 'home/home.html', context) 
      # Return an 'invalid login' error message. 

和HTML:

<form action="." method="POST"> {%csrf_token%} 
    {%if incorrect_login%} 
    <table class='failed_login'> 
    {{form.as_table}} 
    </table> 
    {%else%} 
    <table class='successful_login'> 
    {{form.as_table}} 
    </table> 
    {%endif%} 
    <p><input type='submit' value='Submit'></p> 
</form> 
<!--Dont worry about the exact implementation of the html, its the basic idea im concerned with--> 

不過,我覺得這是一個常見的問題,因此可能存在的形式內Django提供更好的解決方案。我已經研究過關於處理表單的文檔,但是我不知道如何處理,主要的問題是存儲在表單字段中的錯誤似乎更多地關於驗證輸入類型。任何幫助或正確的方向點將不勝感激。

+0

採取看看Django的[信息框架(https://docs.djangoproject.com/en/1.9/ref/contrib/messages /) – GwynBleidD

+0

消息框架很好,但是這*是一個表單錯誤,應該在表單的上下文中顯示。表單可能有全局錯誤和現場錯誤。這看起來像是應該出現在表單頂部的全局錯誤,可以通過模板中的form.errors訪問。 – Shovalt

回答

1

Django自帶built in authentication views,包括一個登錄。您應該考慮使用登錄視圖,或至少看看代碼,看看它是如何工作的。

一個關鍵的問題是,僅爲GET請求創建空白表單。在你看來,問題是你總是用form = LoginForm()創建一個新表格,當user is None。這意味着來自綁定形式的錯誤(form = LoginForm(request.POST))不會顯示給用戶。

0

我要去與大家分享這種方法,也許它可以幫助:

Views.py

from django.shortcuts import render, get_object_or_404 
from django.http import HttpResponseRedirect 
from django.views.generic import View 
from django.core.urlresolvers import reverse 
from django.contrib import messages 
from django.contrib.auth import login, authenticate, logout 
from ..form import UsersForm 


class LoginView(View): 

    template_name = ['yourappname/login.html', 'yourappname/home.html'] 

    def get(self, request, *args, **kwargs): 
     form = UsersForm() 
     if request.user.is_authenticated(): 
      return render(request, self.template_name[1], t) 
     return render(request, self.template_name[0], t) 

    def post(self, request, *args, **kwargs): 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(username = username, password = password) 
     if user is not None: 
      login(request, user) 
      if user.is_active: 
       return render(request, self.template_name[ 1 ]) 
     else: 
      messages.add_message(
       request, messages.ERROR, "Incorrect user or password" 
       ) 
      return HttpResponseRedirect(reverse('yourappname:login')) 

,我看到你已經知道了模板的相互作用,郵遞的方式將用戶和密碼和使用django消息。 如果您希望管理表單中的錯誤,你可以使用乾淨的方法:

https://docs.djangoproject.com/en/1.9/ref/forms/validation/