2016-09-01 6 views
0

Ich habe Probleme beim Anmelden von Benutzern. Ich habe folgende Ansichten und Vorlage:Django Benutzer Login Formular Benutzer ist keine

views.py

def login(request): 
    if request.method == 'POST': 
     username = request.POST.get('username') 
     password = request.POST.get('password') 
     user = auth.authenticate(username=username, password=password) 

     if user is not None: 
      if user.is_active: 
       auth.login(request, user) 
       return HttpResponseRedirect('/') 
      else: 
       return HttpResponseRedirect('disabled account') 

     else: 
      return HttpResponseRedirect('/invalid') 

    else: 
     return render(request, 'login_page.html', {}) 

login_page.html

{% block content %} 

    {% if form.errors %} 
     <p class="error"> sorry, thats not a valid username or password</p> 
    {% endif %} 

<form action="/login/" method="post"> 
    <label for="username">User name:</label> 
    <input type="text" name="username" value="" id="username"> 
    <label for="password">Password:</label> 
    <input type="text" name="password" value="" id="password"> 

    <input type="submit" value="login" /> 

</form> 

{% endblock %} 

Mein Problem ist, wenn ich in dem Login-Formular treffen, egal, was die Werte sind, wird die Seite zur/invald/url umgeleitet. Ich habe einen Benutzer mit der Admin-Funktion eingerichtet, aber ich bekomme immer noch diesen Fehler. Weiß jemand, was das Problem sein könnte?

Benötige ich eine forms.py-Datei mit etwas darin?

Aktualisiert Ansichten:

def login(request): 
    form = LoginForm(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: 
      if user.is_active: 
       login(request, user) 
       return redirect('loggedin.html') 
      else: 
       return HttpResponse("Account deleted or disabled") 


    return render(request, "login_page.html", {'form': form}) 

aktualisierter Form:

from django import forms 
from django.contrib.auth import authenticate, login, logout, get_user_model 

class LoginForm(forms.Form): 
    username = forms.CharField() 
    password = forms.CharField(widget=forms.PasswordInput) 

def clean(self, *args, **kwargs): 
    username = self.cleaned_data.get("username") 
    password = self.cleaned_data.get("password") 
    if username and password: 
     user = authenticate(username=username, password=password) 
     if not user: 
      raise forms.ValidationError("User does not exist.") 
     if not user.is_active: 
      raise forms.ValidationError("User is no longer active.") 
    return super(UserLoginForm, self).clean(*args, **kwargs) 

aktualisiert login_page.html

{% block content %} 

    {% if form.errors %} 
     <p class="error"> sorry, thats not a valid username or password</p> 
    {% endif %} 

<form action="{% url 'login' %}" method="post"> 
    {{ form }} 
    <input type="submit" value="login" /> 
</form> 

{% endblock %} 

Urls:

url(r'^admin/', admin.site.urls), 
    url(r'^login/', views.login, name='login'), 
    url(r'^logout/', views.logout, name='logout'), 
    url(r'^invalid/', views.invalid_login, name='invalid_login'), 
    url(r'^loggedin/', views.loggedin, name='loggedin'), 
    url(r'^$', views.index, name='index'), 
+0

Der Benutzereintrag existiert und ich die Details richtig bin Eingabe, das ist, was mich verblüfft hat. – Abjilla22

+0

Versuchen Sie, django 'django.contrib.auth.forms.AuthenticationForm' zu verwenden (https://docs.djangoproject.com/en/1.10/topics/auth/default/#django.contrib.auth.forms.AuthenticationForm) . Dann könnten Sie eine Fehlerbeschreibung erhalten. – atn

Antwort

1

Ich schlage vor, Sie eine forms.py Datei machen und hier machen eine Klasse wie folgt:

from django import forms 
from django.contrib.auth import authenticate, login, logout, get_user_model 

    class LoginForm(forms.Form): 
    username = forms.CharField() 
    password = forms.CharField(widget=forms.PasswordInput) 

    def clean(self, *args, **kwargs): 
     username = self.cleaned_data.get("username") 
     password = self.cleaned_data.get("password") 
     if username and password: 
      user = authenticate(username=username, password=password) 
      if not user: 
       raise forms.ValidationError("User does not exist.") 
      if not user.is_active: 
       raise forms.ValidationError("User is no longer active.") 
     return super(UserLoginForm, self).clean(*args, **kwargs) 

dann in Ihre Ansichten importieren Login-Formular. Erstellen Sie eine Ansicht als solche:

In Ihrer HTML-Vorlage können Sie das Formular mit der Konvention unten aufrufen. Damit diese Verknüpfung mit der URL funktioniert, benötigen Sie einen app_name = "yourappname" am Anfang Ihrer URL-Datei.

<form method="POST" action="{% url 'yourappname:name_given_to_url_in_urls_file' %}"> 
    {% csrf_token %} 
    {{ form }} 
<input type="submit" class="btn-success" value="Login"/> 
</form> 
+0

Ich erhalte einen Namensfehler "Name 'LoginForm' ist nicht definiert" – Abjilla22

+0

Sie müssen es in Ihre Sichten-Datei importieren: von .forms importieren Sie LoginForm und stellen Sie auch sicher, dass Sie andere erforderliche Importe in der Sichten-Datei haben. – BigMonkey89WithaLeg

+0

Das Problem behoben, es funktioniert jetzt außer im zurück zum ersten Problem - Senden der Benutzerdaten im Formular nur eine aktualisierte Anmeldeseite zurückgibt. – Abjilla22

0

Ich denke, vielleicht ist Ihr Register-Code falsch. sollten wir verwenden set_password

def register(request): 
if request.method == 'POST': 
    reg = User() 
    reg.username = request.POST['register_username'] 
    reg.set_password(request.POST['register_password']) #like this line 
    reg.save() 

nicht reg.password = request.POST [ ‚register_password‘]

Verwandte Themen