ユーザー名またはパスワードが無効でログインできなかった場合にエラーメッセージが表示されるだけです。クリーンメソッドをオーバーライドするよりも、それが望ましい理由はありますか?私は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回だけ表示されます。
このメソッドは、あなたの 'AuthorLogin'フォームでオーバーライドする必要があります。 –
私のAuthorLoginの上のリンクから解決策をコピー&ペーストしようとしましたが、まだ2つのエラーメッセージが表示されます。 –
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