必须使用UserLoginForm实例作为第一个参数调用unbound方法is_valid()(没有任何内容)

时间:2017-08-21 14:52:35

标签: python django django-class-based-views

大家好,有想法的人有助于解决这个错误,我使用Django框架开发一个使用基于类的视图的简单应用程序。

这是我的观看代码:

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

这是我的表格类:

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

提交表单后,我最终收到以下错误:

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

我的错误在哪里?帮忙

1 个答案:

答案 0 :(得分:1)

你在这里遇到了一些问题,但是这会导致你的错误:

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

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

form = self.form_class(request.POST)