2016-09-22 25 views
0

ユーザー名またはパスワードが無効でログインできなかった場合にエラーメッセージが表示されるだけです。クリーンメソッドをオーバーライドするよりも、それが望ましい理由はありますか?私はdjangoがlogin_failedシグナルを持っていることがわかりましたが、私はそれを使用するのが最善であると確信しています。django検証エラーメッセージが2回表示される

https://github.com/afdallismen/Django-error-message-displayed-twice

ここに私のPythonのバージョンと出力ピップリストから、及びPIP凍結

次のとおりです。ここで

は、プリント画面 ここvalidation error message get displayed twice

はgithubのからの私の更新されたコードがありますPython -V

Python 3.5.2 

ピップリスト

Django (1.10.1) 
pip (8.1.2) 
setuptools (27.1.2) 
wheel (0.29.0) 

ピップ凍結

Django==1.10.1 

forms.py

class AuthorLogin(forms.Form): 
    username = forms.CharField(label='Your name', max_length=100) 
    password = forms.CharField(
          label='Your password', 
          max_length=100, 
          widget=forms.PasswordInput) 

    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('Invalid username or password', code='invalid') 
     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 

    def form_invalid(self, form): 
     return self.render_to_response(self.get_context_data(form=form)) 

view.py

def author_login(request): 
    form = AuthorLogin(request.POST or None) 
    if request.POST and form.is_valid(): 
     user = form.login(request) 
     if user is not None: 
      login(request, user) 
      return redirect('microblog:index') 

    return render(request, 'microblog/author_login.html', {'form': form}) 

urls.py

app_name = 'microblog' 
urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
    url(r'^login/', views.author_login, name='author_login'), 
    url(r'^logout/', views.author_logout, name='author_logout'), 
] 

author_login.html

{% extends "base.html" %} 

{% block content %} 
{% if form.non_field_errors %} 
    <ul> 
    {% for error in form.non_field_errors %} 
    <li>{{ error }}</li> 
    {% endfor %} 
    </ul> 
{% endif %} 
<form action="" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Login" /> 
</form> 
{% endblock %} 

iはviews.pyにform.add_error法を介して送信される検証エラーしようとした回避策としてbase.html

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Microblog</title> 
</head> 
<body> 
    {% if user.is_authenticated %} 
    <p>Welcome, {{ request.user.username }}</p> 
    <a href="{% url 'microblog:author_logout' %}">Logout</a> 
    {% else %} 
    <a href="{% url 'microblog:author_login' %}">Login</a> 
    {% endif %} 
    <nav> 
    <ul> 
     <li><a href="{% url 'microblog:index' %}">Microblog</a></li> 
    </ul> 
    </nav> 
    {% block content %}{% endblock %} 
</body> 
</html> 

、クリーン、ログインを除去しますforms.pyのform_invalidメソッド。それはまだ二回、エラーメッセージが表示されたうちの

def author_login(request): 
    if request.method == 'POST': 
     form = AuthorLogin(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      user = authenticate(username=username, password=password) 
      if user is not None: 
       login(request, user) 
       return redirect('microblog:index') 
      else: 
       form.add_error(None, 'Invalid username or password.') # This line seems to get executed twice 
    else: 
     form = AuthorLogin() 

    return render(request, 'microblog/author_login.html', {'form': form}) 

入れます:

は、ここに私の新しいviews.pyです。今はform.add_errorが2回呼び出されたようですね。

def author_login(request): 
    if request.method = 'POST': 
     count = 0 
     ... 
     if form.is_valid() 
      .... 
      if user is not None: 
       .... 
      else: 
       count = count + 1 
       print(count) 

それはこれだけのカウントを印刷し、他のブロックに同じ、一度実行POSTメソッドでauthor_login、1を印刷し、一度だけ印刷:

はこれをしようとしました。しかし、form.add_errorは2回実行されますか?

は、form.non_field_errorsがform.errorsに含まれていたようだ

それを修正します。テンプレートのforms.non_field_errorsへの呼び出しを削除すると、エラーメッセージが1回だけ表示されます。

+0

このメソッドは、あなたの 'AuthorLogin'フォームでオーバーライドする必要があります。 –

+0

私のAuthorLoginの上のリンクから解決策をコピー&ペーストしようとしましたが、まだ2つのエラーメッセージが表示されます。 –

+0

Djangoには、認証[ビュー](https://docs.djangoproject.com/en/1.10/topics/auth/default/#built-in-auth-views)と[フォーム](https:// docs .djangoproject.com/ja/1.10/topics/auth/default /#module-django.contrib.auth.forms)。自分で書く必要はありません。 – Alasdair

答えて

1

エラーがform.non_field_errors

を通じて一度ときにループに表示されます
<ul> 
    {% for error in form.non_field_errors %} 
    <li>{{ error }}</li> 
    {% endfor %} 
</ul> 

と1回whe nはあなたがform.as_pを使用する場合は、手動でform.non_field_errorsをレンダリングする必要はありませんform.as_p

{{ form.as_p }} 

を使用しています。 form.non_field_errorsを手動で表示する場合は、form.as_pではなく、フォームフィールドを個別にレンダリングする必要があります。

詳細はworking with forms in templatesのドキュメントをご覧ください。

+0

ありがとう、私は本当にどのように前に起こるのだろうか。 –

0

clean方法はsuper()を使用する必要がある:

def clean(self): 
    cleaned_data = super(AuthorLogin, self).clean() #insert this line 
    username = cleaned_data.get('username') 
    ... 
+0

それでも、2つのエラーメッセージが表示されます。 –

+0

フォームにこのカスタム 'form_invalid'メソッドを追加してみてください:https://github.com/ubernostrum/django-registration/commit/87f25b6b57f2f33f6d2a51596ed0edd68b3974e1 – souldeux

+0

これも試してみましたが、2つのエラーメッセージが表示されました。 –

0

マニュアルに記載されているようにあなたはこれを試すことができます。

def clean(self): 
    super(AuthorLogin, self).clean() 
    ... 
    # not return anything 
+0

それでも、2つのエラーメッセージを表示しようとしました。 私の質問を編集しましたが、今私はviews.pyのform.add_errorを使用していて、私のform.pyのクリーンメソッドを削除しています。しかし、エラーメッセージは2度表示されました。 –

+0

エラーが既に出力されている場合は、 'base.html'を確認してください。それは唯一の文が2回実行されるより説得力があります。 –

+0

まだ2つのエラーメッセージが表示されますが、私は 'base.html'を拡張していません。 –

関連する問題