2013-03-09 96 views
1

創建UserProfile模型後。我開始創建登錄,但由於get_user()錯誤而卡住了。Django 1.5 - 登錄

EXCEPTION

AttributeError: 'LoginForm' object has no attribute 'get_user' 

這裏是我的代碼:

UPDATE

class LoginView(FormView): 
    form_class = LoginForm 
    redirect_field_name = REDIRECT_FIELD_NAME 
    template_name = 'login.html' 
    success_url = '/' 

    def form_valid(self, form): 
     username = form.cleaned_data['username'] 
     password = form.cleaned_data['password'] 

     user = authenticate(username=username, password=password) 
     if user is not None: 
      if user.is_active: 
       login(self.request, user) 
       return HttpResponseRedirect(self.get_success_url()) 
     else:   
      return self.form_invalid() 

    def form_invalid(self): 
     return HttpResponseRedirect(reverse('accounts:login')) 

    def get_success_url(self): 
     if self.success_url: 
      redirect_to = self.success_url 
     else: 
      redirect_to = self.request.REQUEST.get(self.redirect_field_name, '') 

     netloc = urlparse.urlparse(redirect_to)[1] 
     if not redirect_to: 
      redirect_to = settings.LOGIN_REDIRECT_URL 
     elif netloc and netloc != self.request.get_host(): 
      redirect_to = settings.LOGIN_REDIRECT_URL 
     return redirect_to 

    def post(self, request, *args, **kwargs): 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     if form.is_valid(): 
      return self.form_valid(form) 
     else:     
      return self.form_invalid() 

如何解決這一問題?任何幫助,將不勝感激。我在Django 1.5上真的很新。需要幫忙。

+0

我發現這個文檔中:如果已經定製認證(請參閱自定義身份驗證),您可以通過自定義的認證形式向登錄視圖通過authentication_form參數。該表單必須接受其__init__方法中的請求關鍵字參數,並提供一個返回經過身份驗證的用戶對象的get_user方法(此方法僅在成功驗證表單後纔會調用)。 – 2013-03-09 15:04:07

+0

你能發表這個LoginForm的代碼嗎? – 2013-03-09 15:04:52

+0

@AdriánLópez完成 – catherine 2013-03-09 15:07:04

回答

1

[更新]

在原始代碼中,作者是做稱爲get_user形式方法內的authenticate東西。你已經在表單之外完成了,所以只需將form.get_user()替換爲user即可。

我用的是不是基於類的登錄視圖,而我甚至不關心到使用Django的表單實例,但它應該很容易適應:

def signin(request): 
    if request.method == 'POST': 
     user = authenticate(
      email=request.POST.get('username', '').lower().strip(), 
      password= request.POST.get('password', ''), 
     ) 
     if user is None: 
      messages.error(request, u'Invalid credentials') 
     else: 
      if user.is_active: 
       login(request, user) 
       return HttpResponseRedirect(request.GET.get('next', '/')) 
      else: 
       messages.error(request, u'User is not active.') 

    return render_to_response('login.html', locals(),  
         context_instance=RequestContext(request)) 

[老答案]

爲表單定義get_user方法。

未經測試(但應該讓你在正確的道路):

def get_user(self): 
    from django.contrib.auth import authenticate 
    return authenticate(
      email=self.cleaned_data.get('username', '').lower().strip(), 
      password=self.cleaned_data.get('password', ''), 
    )    
+0

另一個錯誤:'用戶'對象沒有屬性'後端' – catherine 2013-03-09 15:59:34

+0

@catherine:你可以嘗試更新的代碼嗎? (我使用電子郵件字段作爲用戶名,請適應您的需要) – 2013-03-09 16:00:30

+0

完成,........ – catherine 2013-03-09 16:03:15