Django "login () nimmt genau 1 Argument (2 angegeben)" Fehler

86

Ich versuche, die Benutzer-ID in der Sitzung mit django.contrib.auth.login zu speichern. Aber es funktioniert nicht wie erwartet.

Ich erhalte eine Fehleranmeldung () benötigt genau 1 Argument (2 angegeben)

Mit login (user) erhalte ich AttributeError unter / login / User 'Objekt hat kein Attribut' Methode '

Ich verwende ein leicht modifiziertes Beispielformular 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})

An login.html ist nichts Besonderes:

<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>

Hat jemand eine Idee, wie login () funktioniert.

Alex Bolotov
quelle
4
wird funktionieren, wenn Sie Ihre Ansicht umbenennen
Evgeny
Nur die Frage und Antwort, nach der ich gesucht habe. Einer von mehreren Fehlern, die ich gemacht habe, als ich versucht habe, Anmeldungen in Django zum Laufen zu bringen, Contexts vs RequestContexts verwendet und csrf_tokens weggelassen habe.
Chuckmash
Hier finden Sie ein Tutorial über Django-Benutzer lowcoupling.com/post/71289666862/django-the-user-tutorial. Es gibt auch ein GitHub-Projekt, das Sie klonen und überprüfen können
lowcoupling

Antworten:

236

Ihre Ansichtsfunktion wird ebenfalls aufgerufen login, und der Aufruf von wird login(request, user)am Ende als Versuch interpretiert, diese Funktion rekursiv aufzurufen:

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

Um dies zu vermeiden, benennen Sie Ihre Ansichtsfunktion um oder verweisen Sie auf eine andere Weise auf die loginvon django.contrib.auth. Sie können beispielsweise den Import ändern, um die Anmeldefunktion umzubenennen:

from django.contrib.auth import login as auth_login

...
auth_login(request, user)
etw
quelle
Wow, ich habe Djangos Quellcode durchgesehen und jede ältere verfügbare Version
ausprobiert, weil
16

Eine mögliche Lösung:

from django.contrib import auth

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

Jetzt überschreibt Ihr Ansichtsname den Ansichtsnamen von Django nicht mehr.

ars
quelle
9

Ein anderer Weg:

from django.contrib.auth import login as auth_login

dann anrufen auth_login(request, user)statt login(request, user).

bbsimon
quelle