2016-10-12 4 views
1

に非アクティブなユーザーのためにFalseを返すlogin.html、私が持っている:は、私のテンプレートでは、テンプレート

{% if form.errors %} 
    {% if user.is_authenticated %} 
    <div class="alert alert-warning"><center>Your account doesn't have access to this utility.</center></div> 
    {% else %} 
    <div class="alert alert-warning"><center>Incorrect username or password!</center></div> 
    {% endif %} 
{% endif %} 

私がやろうとしていますどのようなフォーム送信後、ユーザーが別の表示、非アクティブである場合、ありますエラーメッセージが表示され、ユーザーが単に認証されていない場合、不正なユーザー名パスワードエラーメッセージが表示されます。これは機能しません。常に「不正なユーザー名またはパスワード!」と表示されます。どちらの場合もただし、ビュー内でuser.is_authenticatedは、アクティブでないユーザーの場合でもTrueを返します。

私はこれを行うために他の道がありますか?また、私はform.errorsを印刷しようとすると、それは非アクティブなユーザーのための「このアカウントがアクティブでない」というテキストを示していても、あまりにも

{% if 'inactive' in form.errors %} 

しかし、このdoesntの仕事を試してみました。

EDIT:ビューのために 、私は単純にカスタムログインビュー内Djangoのログインビューを使用しています

views.py:

from django.contrib.auth.views import login, logout 
from django.shortcuts import render, redirect 

def custom_login(request, **kwargs): 
    if request.user.is_authenticated(): 
     return redirect('/homepage/') 
    else: 
     return login(request, **kwargs) 
+1

ビューの関連部分を表示できますか? –

+0

@MosesKoledoye私は単にdjangoのデフォルトのログインビューを使用しています。更新された質問 – MohitC

答えて

2

ログインテンプレートで{% if user.is_authenticated %}をチェックしていない任意のポイントがあります。ユーザーが認証されている場合は、custom_loginビューでホームページにリダイレクトされます。アカウントがアクティブでない場合

して、その後、フォームは無効になり、ユーザーはログインできませんフォームのエラーは次のようになります。エラーがあるので、そこで{% if 'inactive' in form.errors %}をチェックすると、動作しません

{'__all__': [u'This account is inactive.']} 

__all__のキーで保存され、inactiveではありません。

あなたは{% if 'This account is inactive.' in form.non_field_errors %}とすることができますが、これは非常に壊れやすく、Djangoが非アクティブユーザーのエラーメッセージのテキストを変更した場合には壊れてしまいます。

テンプレートにどのような種類のエラーがあるかを調べるのではなく、実際のエラーを表示する方がよいでしょう。非フィールドのエラーを表示する最も簡単な方法は、することです:

{{ form.non_field_errors }} 

それとも、あなたはより多くの制御が必要な場合:

{% for error in form.non_field_errors %} 
    {{ error }} 
{% endfor %} 

あなたが非アクティブなユーザーのためのエラーメッセージを変更する必要がある場合は、サブクラス化することができます認証フォームを作成し、ログインビューでそれを使用します。

my_error_messages = AuthenticationForm.error_messages.copy() 
my_error_messages['inactive'] = 'My custom message' 

class MyAuthenticationForm(AuthenticationForm): 
    error_messages = my_error_messages 
+0

これは意味がありますが、私の見解では 'request.user.is_authenticated()'は、ユーザーが既にログインしていてアクセスログインページ。 このコードは、非アクティブなユーザーをホームページにリダイレクトしません。なぜですか?また、なぜis_authenticatedチェックがテンプレートで動作しないのでしょうか? – MohitC

+2

認証フォームは、ユーザーがログインしていない場合にログインしません。非アクティブなエラーメッセージでフォームが無効になります。非アクティブなユーザはログインしていないので、テンプレート内の '{%if user.is_authenticated%}'は常に 'False'になります。 – Alasdair

+1

今は完全に理にかなっています。ありがとうございました – MohitC

1

あなた本当にはつまり、あなたがAuthenticationForm.get_user()を使用することができ、明示的にユーザーが存在しますが、非アクティブであるかどうかを確認したい場合だけ、Alasdairの非常に賢明な答えを補完する:

{% if form.errors %} 
    {% with form.get_user as user %} 
    {% if user %} 
     {# the user is inactive #} 
    {% else %} 
     {# no user matching username/password #} 
    {% endif %} 
    {% endwith %} 
{% endif %} 

これはあなたを想定していますもちろんデフォルトのdjango.contrib.auth.forms.AuthenticationFormを使用しています - あなた自身で使用し、confirm_login_allowed()を上書きして独自のポリシーを実装することができます。

+0

これは素晴らしいことですが、私は@ Alasdairの選択肢に行きます。ありがとう! – MohitC

+0

@MohitCはい、それは明らかに最も賢明なことです;) –

関連する問題