2016-05-12 14 views
0

認証が失敗した場合、djangoのログインフォームで「無効なユーザー名またはパスワードの行に沿ってエラーメッセージを表示したいですが、これをやり遂げる最善の方法が何であるかはわかりません。 私は、テンプレートに渡されるコンテキスト変数を設定してから、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--> 

これは共通の問題であるようにしかし、私は感じるので、フォーム内のジャンゴが提供するよりよい解決策がありそうです。私はフォームを使って作業することについてドキュメントを調べましたが、アプローチする方法がわかりません。主な問題は、フォームフィールドに格納されているエラーが入力タイプの検証にあると思われることです。どのような助けや正しい方向への指摘も感謝します。

+0

はDjangoのを見て、[メッセージのフレームワーク](https://docs.djangoproject.com/en/1.9/refを取ります/ contrib/messages /) – GwynBleidD

+0

メッセージフレームワークは素晴らしいですが、*フォームエラーです。フォームのコンテキストで表示する必要があります。フォームは、グローバルエラーとフィールドエラーの両方を持つことができます。これは、テンプレートの 'form.errors'を介してアクセス可能な、フォームの上部に現れるべきグローバルエラーのようです。 – Shovalt

答えて

1

Djangoにはbuilt in authentication viewsが付属しています。ログインビューを使用するか、少なくともそのコードを見てその動作を確認してください。

重要な点の1つは、空白のフォームがGETリクエストに対してのみ作成されることです。あなたの見解では、user is Noneのときに常にform = LoginForm()という新しいフォームを作成するという問題があります。つまり、結合フォーム(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/

関連する問題