2014-05-09 87 views
3

python和django都很新,請原諒我,如果這是一個新手問題。嘗試擴展時出錯django.contrib.auth.views.login

我想弄清楚如何在django.contrib.auth.login中擴展功能。我正在採取的第一步是簡單地使用我自己的函數登錄行爲,但不會添加任何新行爲。我的項目名稱是testproject。

在testproject/testproject/urls.py

urlpatterns = patterns('', 
    (r'^login$', 'auth.views.login_user'), 
) 

在testproject /認證/ views.py

from django.contrib.auth import login 

def login_user(request, template_name='registration/login.html'): 
    return login(request, template_name) 

然而,這給我下面的錯誤:

Traceback: 
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/home/user/src/testproject/auth/views.py" in login_user 
    4.  return login(request, template_name) 
File "/usr/lib/python2.7/dist-packages/django/contrib/auth/__init__.py" in login 
    72.  request.session[SESSION_KEY] = user.id 

Exception Type: AttributeError at /login/ 
Exception Value: 'str' object has no attribute 'id' 

如果我再次ce auth.views.login_userdjango.contrib.auth.views.login,一切工作正常。我很難過,我做錯了什麼?還是我以錯誤的方式接近整個問題?

+0

'登錄()'需要一個'request'和'user'對象作爲參數。不是'user'對象,而是給出了一個字符串(模板名稱)。因此,代碼嘗試訪問「用戶」對象的屬性時出錯。 –

回答

1

您的login_user()是一個視圖。因此,它需要返回一個HttpResponse對象。

login()實際上接受請求和用戶。查看Django docs for an example如何在視圖中正確使用login()

參考Django文檔和你的榜樣,你的login_user()視圖應該是這個樣子:

from django.http import HttpResponseRedirect 
from django.shortcuts import render 
from django.contrib.auth import authenticate, login 

def login_user(request, template_name='registration/login.html'): 
    username = request.POST['username'] 
    password = request.POST['password'] 
    user = authenticate(username=username, password=password) 
    if user is not None: 
     if user.is_active: 
      login(request, user) 
      # Redirect to a success page. 
      return HttpResponseRedirect('/home/') 
     else: 
      # Return a 'disabled account' error message 
      return render(request, template_name, {'error': 'disabled account'}) 
    else: 
     # Return an 'invalid login' error message. 
     return render(request, template_name, {'error': 'invalid login'}) 
+0

啊,你的回答讓我找到了解決辦法。我從'django.contrib.auth'導入登錄名,但是我想從'django.contrib.auth.views'中導入它。一旦我糾正這一切,一切都奏效。另外一個問題是,從一個視圖導入功能到另一個視圖是不好的做法? – rmclo

相關問題