2009-07-15 10 views
83

私はdjango.contrib.auth.loginを使ってセッションにユーザーのIDを格納しようとしています。しかし、期待通りには機能しません。Django "login()はちょうど1つの引数(与えられた2つ)"エラーを返します。

私はまさに私が/ログイン/ユーザーではAttributeErrorを取得しています(与えられた2)1つの引数にログイン(ユーザー)で

エラーログインを()メソッド 『」オブジェクトを何も属性を持っていない』のテイク取得しています

私は少しmodifyed例フォームhttp://docs.djangoproject.com/en/dev/topics/auth/を使用しています:login.htmlとは特別なものは何もありません

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

<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()の作業方法を知っている人はいませんか。

+3

あなたのビューの名前を変更すると動作します – Evgeny

+0

私が探していた質問と回答です。 ContextsとRequestContextsを使用し、csrf_tokensを省略して、djangoでログインして実行しようとしている間にいくつかの間違いの1つ。 – chucksmash

+0

ここでは、Djangoユーザーに関するチュートリアルを見つけることができますhttp://lowcoupling.com/post/71289666862/django-the-user-tutorialクローンとチェックを行うことができるGitHubプロジェクトもあります – lowcoupling

答えて

230

あなたのビュー機能もloginと呼ばれ、login(request, user)への呼び出しを再帰的にこの関数を呼び出そうとしていると解釈されてしまう:

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

を、それはあなたのビュー関数の名前を変更したりからloginを参照してください避けるためにいくつか異なる方法でdjango.contrib.authあなた例えばログイン機能の名前を変更するには、インポートを変更することができます:

from django.contrib.auth import login as auth_login 

... 
auth_login(request, user) 
+0

Wow、私はDjangoのソースコードをブラウズしていました、すべての古いバージョンを利用可能にしようと思って、私が狂っていると思った – Mojimi

15

一つの可能​​な修正:

from django.contrib import auth 

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

今すぐあなたのビュー名はDjangoのビュー名を上書きしません。

9

別の方法:

from django.contrib.auth import login as auth_login 

、代わりにlogin(request, user)auth_login(request, user)を呼び出します。