Ich möchte nur eine Fehlermeldung haben, wenn Benutzer aufgrund eines ungültigen Benutzernamens oder eines Passworts nicht einloggen konnte. Ist es vorzuziehen, warum es als eine saubere Methode zu überschreiben? Ich fand, dass Django login_failed Signale haben, aber ich bin mir nicht sicher, es am besten zu verwenden. Hierdjango Validierung Fehlermeldung zweimal angezeigt werden
ist die Druckbild validation error message get displayed twice
Hier ist meine aktualisierte Code von Github:
https://github.com/afdallismen/Django-error-message-displayed-twice
Hier ist meine Python-Version und Ausgabe von pip Liste und gefrier pip
python -V
Python 3.5.2
pip Liste
Django (1.10.1)
pip (8.1.2)
setuptools (27.1.2)
wheel (0.29.0)
pip freeze
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 %}
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>
Als Abhilfe zu i durch form.add_error Verfahren Validierungsfehler in views.py versucht gesendet, und Entfernen sauber, Login und form_invalid-Methode für forms.py.
Hier ist meine neue views.py:
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})
entpuppen es noch Fehlermeldung zweimal angezeigt. Nun scheint es, dass form.add_error zweimal aufgerufen wurde, oder?
dies versucht:
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)
Es 1 drucken und nur einmal gedruckt, so mit POST-Methode author_login nur einmal ausgeführt, gleiches für anderen Block, die zählen drucken. Aber form.add_error wird zweimal ausgeführt?
Fix it
Es scheint form.non_field_errors wurde in form.errors enthalten. Wenn Sie den Aufruf von forms.non_field_errors in Vorlagen löschen, wird die Fehlermeldung nur einmal angezeigt.
Sie sollten diese Methode in Ihrem 'AuthorLogin' Formular überschreiben. –
versucht, Lösung von Link oben in meinem AuthorLogin kopieren und einfügen von immer noch geben Sie mir zwei Fehlermeldung. –
Beachten Sie, dass Django mit Authentifizierung [views] (https://docs.djangoproject.com/en/1.10/topics/auth/default/#built-in-auth-views) und [forms] (https: // docs .djangoproject.com/de/1.10/topics/auth/default/#moduldjango.contrib.auth.forms). Sie müssen nicht Ihre eigenen schreiben. – Alasdair