2013-03-09 77 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