2016-09-22 2 views
0

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.

+0

Sie sollten diese Methode in Ihrem 'AuthorLogin' Formular überschreiben. –

+0

versucht, Lösung von Link oben in meinem AuthorLogin kopieren und einfügen von immer noch geben Sie mir zwei Fehlermeldung. –

+0

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

Antwort

1

Der Fehler einmal angezeigt, wenn Sie eine Schleife durch form.non_field_errors

<ul> 
    {% for error in form.non_field_errors %} 
    <li>{{ error }}</li> 
    {% endfor %} 
</ul> 

und einmal whe n Sie verwenden form.as_p

{{ form.as_p }} 

Wenn Sie form.as_p verwenden, dann müssen Sie nicht form.non_field_errors manuell machen. Wenn Sie form.non_field_errors manuell anzeigen, müssen Sie die Formularfelder einzeln rendern, anstatt form.as_p zu verwenden.

Weitere Informationen finden Sie in der Dokumentation unter working with forms in templates.

+0

Danke, ich frage mich wirklich wie das vorher passiert ist. –

0

Die clean Methode muss super() verwenden:

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

Versucht, dass immer noch zwei Fehlermeldung angezeigt wird. –

+0

Versuchen Sie, diese benutzerdefinierte 'form_invalid' Methode zu Ihrem Formular hinzuzufügen: https://github.com/ubernostrum/django-registration/commit/87f25b6b57f2f33f6d2a51596ed0edd68b3974e1 – souldeux

+0

Versucht, dass auch immer noch zwei Fehlermeldung angezeigt wird. –

0

Sie dies versuchen, wie in der Dokumentation beschrieben:

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

Versucht, dass immer noch zwei Fehlermeldung angezeigt wird. Ich habe meine Frage bearbeitet, jetzt verwende ich form.add_error in views.py und entferne saubere Methode in meinem form.py. Aber Fehlermeldung wird immer noch zweimal angezeigt. –

+0

Überprüfen Sie Ihre 'base.html', wenn der Fehler bereits ausgegeben wurde. Das ist überzeugender als der einzige Satz, der zweimal ausgeführt wird. –

+0

Immer noch 2 Fehlermeldung angezeigt, auch wenn ich 'base.html' nicht erweitere. –

Verwandte Themen