Django „login () przyjmuje dokładnie 1 argument (podane 2)” błąd


86

Próbuję przechowywać identyfikator użytkownika w sesji przy użyciu django.contrib.auth.login. Ale to nie działa zgodnie z oczekiwaniami.

Otrzymuję błąd login () przyjmuje dokładnie 1 argument (podane 2)

Przy logowaniu (użytkownik) otrzymuję błąd AttributeError at / login / User 'obiekt nie ma atrybutu' method '

Używam lekko zmodyfikowanego przykładowego formularza 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})

nie ma nic specjalnego w 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 sprawić, by login () działało.


4
zadziała, jeśli zmienisz nazwę widoku
Evgeny,

Tylko pytanie i odpowiedź, której szukałem. Jeden z kilku błędów, które popełniłem podczas próby skonfigurowania i uruchomienia logowań w django, wraz z używaniem Contexts vs RequestContexts i pomijaniem csrf_tokens.
chucksmash

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

Odpowiedzi:


236

Twoja funkcja widoku jest również wywoływana login, a wywołanie do login(request, user)kończy się interpretacją jako próba wywołania tej funkcji rekurencyjnie:

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

Aby tego uniknąć, zmień nazwę funkcji widoku lub odwołaj się do loginfrom django.contrib.authw inny sposób. Możesz na przykład zmienić import, aby zmienić nazwę funkcji logowania:

from django.contrib.auth import login as auth_login

...
auth_login(request, user)

Wow, przeglądałem kod źródłowy Django i wypróbowywałem każdą dostępną starszą wersję, myśląc, że oszalałem
Mojimi

16

Jedna możliwa poprawka:

from django.contrib import auth

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

Teraz nazwa widoku nie zastępuje nazwy widoku django.


9

Inny sposób:

from django.contrib.auth import login as auth_login

wtedy zadzwoń auth_login(request, user)zamiast login(request, user).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.