Django “login () leva exatamente 1 argumento (2 dados)” erro


86

Estou tentando armazenar o ID do usuário na sessão usando django.contrib.auth.login. Mas não está funcionando como o esperado.

Estou recebendo um erro, login () leva exatamente 1 argumento (2 dados)

Com login (usuário) estou obtendo AttributeError em / login / User 'objeto não tem atributo' método '

Estou usando o formulário de exemplo ligeiramente 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})

não há nada de especial em 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>

Alguém tem ideia de como fazer o login () funcionar?


4
funcionará se você renomear sua visualização
Evgeny

Apenas a pergunta e a resposta que eu procurava. Um dos vários erros que cometi ao tentar fazer os logins funcionar no django, junto com o uso de Contexts vs RequestContexts e omitindo csrf_tokens.
chucksmash

aqui você pode encontrar um tutorial sobre os usuários do Django lowcoupling.com/post/71289666862/django-the-user-tutorial também há um projeto GitHub que você pode clonar e verificar
lowcoupling

Respostas:


236

Sua função de visualização também é chamada login, e a chamada para login(request, user)acaba sendo interpretada como uma tentativa de chamar esta função recursivamente:

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

Para evitá-lo, renomeie sua função de visualização ou consulte o loginde django.contrib.authde alguma maneira diferente. Você pode, por exemplo, alterar a importação para renomear a função de login:

from django.contrib.auth import login as auth_login

...
auth_login(request, user)

Uau, eu estava navegando no código-fonte do Django e tentando todas as versões anteriores disponíveis, pensando que estava ficando louco
Mojimi

16

Uma solução possível:

from django.contrib import auth

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

Agora seu nome de visão não sobrescreve o nome de visão de django.


9

Outra maneira:

from django.contrib.auth import login as auth_login

em seguida, ligue em auth_login(request, user)vez de login(request, user).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.