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

私が探していた質問と回答だけです。Contexts vs RequestContextsを使用し、csrf_tokensを除外するとともに、djangoでログインを起動して実行しようとしたときに犯したいくつかの間違いの1つ。
chucksmash

ここでは、Djangoユーザーに関するチュートリアルを見つけることができますlowcouple.com/post/71289666862/django-the-user-tutorialクローンを作成して確認できるGitHubプロジェクトもあります
lowcouple 2013

回答:


236

ビュー関数も呼び出されloginlogin(request, user)への呼び出しは、この関数を再帰的に呼び出そうとする試みとして解釈されることになります。

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

これを回避するには、ビュー関数の名前を変更するか、別の方法でloginfromdjango.contrib.authを参照します。たとえば、インポートを変更して、ログイン機能の名前を変更できます。

from django.contrib.auth import login as auth_login

...
auth_login(request, user)

うわー、私は、Djangoのソースコードを閲覧し、利用可能なすべての古いバージョンをしようと、私は非常識を行っていたことを考えていた
Mojimi

16

1つの可能な修正:

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)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.