Django "login () prend exactement 1 argument (2 donnés)" erreur


86

J'essaie de stocker l'ID de l'utilisateur dans la session en utilisant django.contrib.auth.login. Mais cela ne fonctionne pas comme prévu.

J'obtiens une erreur login () prend exactement 1 argument (2 donnés)

Avec login (user), j'obtiens AttributeError à / login / User 'object has no attribute' method '

J'utilise un exemple de formulaire légèrement modifié 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})

il n'y a rien de spécial à propos de 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>

Quelqu'un a-t-il une idée du fonctionnement de login ()?


4
fonctionnera si vous renommez votre vue
Evgeny

Juste la question et la réponse que je cherchais. L'une des nombreuses erreurs que je faisais en essayant de créer des connexions dans django, en utilisant Contexts vs RequestContexts et en omettant csrf_tokens.
chucksmash

Vous pouvez trouver un tutoriel sur les utilisateurs de Django lowcoupling.com/post/71289666862/django-the-user-tutorial il y a aussi un projet GitHub , vous pouvez cloner et vérifier
lowcoupling

Réponses:


236

Votre fonction de vue est également appelée login, et l'appel à login(request, user)finit par être interprété comme une tentative d'appeler cette fonction de manière récursive:

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

Pour éviter cela, renommez votre fonction d'affichage ou référez-vous à loginde django.contrib.authd'une manière différente. Vous pouvez par exemple modifier l'importation pour renommer la fonction de connexion:

from django.contrib.auth import login as auth_login

...
auth_login(request, user)

Wow, je parcourais le code source de Django et j'essayais toutes les anciennes versions disponibles, pensant que j'allais devenir fou
Mojimi

16

Une solution possible:

from django.contrib import auth

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

Désormais, votre nom de vue n'écrase pas le nom de vue de django.


9

Autrement:

from django.contrib.auth import login as auth_login

puis appelez auth_login(request, user)au lieu de login(request, user).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.