Ошибка Django «login () принимает ровно 1 аргумент (задано 2)»


86

Я пытаюсь сохранить идентификатор пользователя в сеансе с помощью django.contrib.auth.login. Но это работает не так, как ожидалось.

Я получаю сообщение об ошибке login () принимает ровно 1 аргумент (2 задано)

С логином (пользователем) я получаю AttributeError в / login / User 'объект не имеет атрибута' method '

Я использую слегка измененную форму примера 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
будет работать, если переименовать свой вид
Евгений

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

здесь вы можете найти учебник для пользователей 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 и пробовал каждую доступную старую версию, думая, что схожу с ума
Mojimi

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.