Помилка Django "login () приймає рівно 1 аргумент (2 дані)"


86

Я намагаюся зберегти ідентифікатор користувача в сеансі за допомогою django.contrib.auth.login. Але це працює не так, як очікувалося.

Я отримую помилку login () приймає рівно 1 аргумент (2 задано)

З логіном (користувачем) я отримую AttributeError на / login / User 'об'єкт не має атрибуту' метод '

Я використовую трохи модифікований приклад форми 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})

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

Хтось знає, як зробити так, щоб login () працював.


4
спрацює, якщо ви перейменуєте свою точку зору
Evgeny

Тільки питання та відповідь, які я шукав. Одна з кількох помилок, яку я зробив, намагаючись запустити логіни та запустити в django, разом із використанням Contexts vs RequestContexts та не враховуючи csrf_tokens.
chucksmash

тут ви можете знайти підручник про користувачів Django lowcoupling.com/post/71289666862/django-the-user-tutorial , є також проект GitHub, який ви можете клонувати та перевірити
lowcoupling

Відповіді:


236

Також викликається ваша функція перегляду login, і виклик до login(request, user)закінчується інтерпретацією як спробу рекурсивного виклику цієї функції:

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

Щоб уникнути цього, перейменуйте свою функцію перегляду або по- іншому посилайтеся на loginfrom django.contrib.auth. Наприклад, ви можете змінити імпорт, щоб перейменувати функцію входу:

from django.contrib.auth import login as auth_login

...
auth_login(request, user)

Ого, я переглядав вихідний код Django і пробував кожну доступну стару версію, думаючи, що зійшов з розуму
Мохімі

16

Одне з можливих виправлень:

from django.contrib import auth

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

Тепер ваше ім'я подання не замінює ім'я подання django.


9

Інший спосіб:

from django.contrib.auth import login as auth_login

то зателефонуйте auth_login(request, user)замість login(request, user).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.