Django error "login () toma exactamente 1 argumento (2 dados)"

86

Estoy tratando de almacenar la ID del usuario en la sesión usando django.contrib.auth.login. Pero no está funcionando como se esperaba.

Recibo un error de inicio de sesión () toma exactamente 1 argumento (2 dados)

Con el inicio de sesión (usuario) obtengo AttributeError en / login / User 'el objeto no tiene atributo' método '

Estoy usando un formulario de ejemplo ligeramente modificado 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})

no hay nada especial en 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>

¿Alguien tiene idea de cómo hacer que login () funcione?

Alex Bolotov
fuente
4
funcionará si cambia el nombre de su vista
Evgeny
Solo la pregunta y la respuesta que estaba buscando. Uno de los varios errores que estaba cometiendo al intentar iniciar y ejecutar los inicios de sesión en django, junto con el uso de Contexts vs RequestContexts y omitir csrf_tokens.
chucksmash
aquí puede encontrar un tutorial sobre los usuarios de Django lowcoupling.com/post/71289666862/django-the-user-tutorial también hay un proyecto de GitHub que puede clonar y verificar
lowcoupling

Respuestas:

236

También se llama a su función de vista login, y la llamada a login(request, user)termina siendo interpretada como un intento de llamar a esta función de forma recursiva:

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

Para evitarlo, cambie el nombre de su función de vista o consulte el loginde django.contrib.authde alguna manera diferente. Por ejemplo, podría cambiar la importación para cambiar el nombre de la función de inicio de sesión:

from django.contrib.auth import login as auth_login

...
auth_login(request, user)
algo
fuente
Wow, estaba navegando por el código fuente de Django y probando todas las versiones anteriores disponibles, pensando que me estaba volviendo loco
Mojimi
16

Una posible solución:

from django.contrib import auth

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

Ahora el nombre de su vista no sobrescribe el nombre de la vista de django.

ars
fuente
9

De otra manera:

from django.contrib.auth import login as auth_login

luego llame en auth_login(request, user)lugar de login(request, user).

bbsimon
fuente