2017-08-21 47 views
-1

你好家伙有想法的人有助于解决这个错误,我正在使用Django框架开发一个简单的应用程序使用基于类的视图。未绑定的方法is_valid()必须调用UserLoginForm实例作为第一个参数

这里是我查看代码:

class OpenLogin(FormView): 
    template_name = 'signin.html' 
    form_class = UserLoginForm 

    def post(self, request, *args, **kwargs): 
     form = self.form_class 
     next_url = self.request.GET.get('next') 
     if form.is_valid(): 
      username = form.cleaned_data.get('username') 
      password = form.cleaned_data.get('password') 

      obj = authenticate(username=username, password=password) 
      if obj is not None: 
       if obj.is_active(): 
        login(self.request, obj) 
        if next_url is not None: 
         return HttpResponseRedirect(next_url) 
        else: 
         return HttpResponseRedirect(reverse('index')) 
       else: 
        messages.error(self.request, 'Error! sorry account is not active') 
        return HttpResponseRedirect(reverse('signin')) 
      else: 
       messages.error(self.request, 'Error!, sorry account is not found') 
       return HttpResponseRedirect(reverse('signin')) 
     else: 
      messages.error(self.request, 'Sorry! an error occurred, try again') 
      context = { 
       'title': 'Sign In', 
       'next_url': next_url, 
       'messages': messages.get_messages(self.request), 
       'user': self.request.user, 
       'form':form, 
      } 

      return context 

,这里是我的表单类:

unbound method is_valid() must be called with UserLoginForm instance as first argument (got nothing instead) 

class UserLoginForm(forms.Form): 
    username = forms.CharField(max_length=User._meta.get_field('email').max_length) 
    password = forms.CharField(min_length=6, max_length=16, widget=forms.PasswordInput()) 

    def is_valid(self): 
     valid = super(UserLoginForm, self).is_valid() 
     if not valid: 
      return valid 
     try: 
      user = User.objects.get(
       Q(username=self.cleaned_data['username']) | Q(email=self.cleaned_data['username']) 
      ) 
     except User.DoesNotExist: 
      self._errors['no_user'] = 'User does not exist' 
      return False 
     if not check_password(self.cleaned_data['password'], user.password): 
      self._errors['invalid_password'] = 'Password is invalid' 
      return False 
     return True 

提交我结束了以下错误表格后我的错误在哪里?帮帮忙

+1

[这](https://stackoverflow.com/questions/30227119/extending-form-is-valid)将帮助您了解为什么你不应该扩展is_valid方法 –

+1

如果你完全替换了它的'post()'方法,那么使用'FormView'就没有意义了 - 你应该钩住'form_valid()'和'FormView'的祖先提供的其他钩子。 –

回答

1

你有一对夫妇在这里的问题,但是这是造成你的即时错误之一:

form = self.form_class 
... 
if form.is_valid(): 

self.form_class是对类的引用,而不是一个表单实例。你应该根据你的要求构建一个表单实例,并验证:

form = self.form_class(request.POST) 
+1

如果您要替换'post',不使用'FormView'的声音是合理的 - 在我看来,基于类的视图隐藏了太多与Django相比纯粹功能性视图的新手的逻辑,但是如果你这样做想要使用它们,你应该期望花费一些努力来弄清楚你可以覆盖的最小的部分以获得你想要的行为。 –

+0

好的兄弟,我正在研究它@Peter –

相关问题