2009-07-15 9 views
83

Próbuję zapisać identyfikator użytkownika w sesji przy użyciu django.contrib.auth.login. Ale nie działa niezgodnie z oczekiwaniami.Django "login() zajmuje dokładnie 1 argument (2 dane)" error

Dostaję błędu login() wykonuje dokładnie 1 argument (2 podany)

login (użytkownik) Dostaję AttributeError w/login/user”obiektu nie ma atrybutu 'metoda'

Używam nieznacznie modifyed przykładowy formularz http://docs.djangoproject.com/en/dev/topics/auth/:

from django.shortcuts import render_to_response 
from django.contrib.auth import authenticate, login 

def login(request): 
    msg = [] 
    if request.method == 'POST': 
     username = request.POST['u'] 
     password = request.POST['p'] 
     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(request, user) 
       msg.append("login successful") 
      else: 
       msg.append("disabled account") 
     else: 
      msg.append("invalid login") 
    return render_to_response('login.html', {'errors': msg}) 

nic szczególnego login.html:

<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <form action="/login/" method="post"> 
     Login:&nbsp; <input type="text" name="u"> 
    <br/> 
     Password:&nbsp; <input type="password" name="p"> 
     <input type="submit" value="Login"> 
    </form> 
    {% if errors %} 
     <ul> 
      {% for error in errors %} 
      <li>{{ error }}</li> 
      {% endfor %} 
     </ul> 
    {% endif %} 

</body> 
</html> 

Czy ktoś ma pomysł, jak zrobić logowanie() działa.

+3

będzie działać, jeśli zmienisz nazwę widoku – Evgeny

+0

Tylko pytanie i odpowiedź, której szukałem. Jeden z kilku błędów, które popełniłem, próbując uruchomić logowanie w django, używając Contexts vs RequestContexts i pomijając csrf_tokens. – chucksmash

+0

tutaj możesz znaleźć samouczek o użytkownikach Django http://lowcoupling.com/post/71289666862/django-the-user-tutorial Istnieje również projekt GitHub, który możesz sklonować i sprawdzić – lowcoupling

Odpowiedz

230

Twoja funkcja widok jest również nazywany login i wywołanie login(request, user) kończy się interpretować jako próbę wywołania tej funkcji rekurencyjnie:

def login(request): 
    ... 
    login(request, user) 

Aby uniknąć go przemianować swoją funkcję widoku lub odnoszą się do login od django.contrib.auth w inny sposób. Można na przykład zmienić import do zmiany nazwy funkcji logowania:

from django.contrib.auth import login as auth_login 

... 
auth_login(request, user) 
+0

Wow, przeglądałem kod źródłowy Django i wypróbowanie każdej starszej wersji, myśląc, że oszalałem – Mojimi

15

Możliwym fix:

from django.contrib import auth 

def login(request): 
    # .... 
    auth.login(request, user) 
    # ... 

Teraz twoja nazwa widoku nie nadpisuje Django nazwę widoku.

9

Innym sposobem:

from django.contrib.auth import login as auth_login 

następnie wywołać auth_login(request, user) zamiast login(request, user).

Powiązane problemy