Django“ login()恰好接受1个参数(给定2个)”错误


86

我正在尝试使用django.contrib.auth.login将用户的ID存储在会话中。但是它没有按预期工作。

我遇到错误login()正好接受1个参数(给定2个)

使用login(user)我在/ login /处得到AttributeError用户的对象没有属性“方法”

我正在使用经过稍微修改的示例表单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 2012年

在这里您可以找到有关Django用户的教程lowcoupling.com/post/71289666862/django-the-user-tutorial还有一个可以克隆和检查的GitHub项目
lowcoupling 2013年

Answers:


236

您的view函数也称为login,并且对login(request, user)end的调用最终被解释为尝试递归调用此函数:

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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.