Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 必须使用UserLoginForm实例作为第一个参数调用unbound方法is_valid()(而不是获取任何内容)_Python_Django_Django Class Based Views - Fatal编程技术网

Python 必须使用UserLoginForm实例作为第一个参数调用unbound方法is_valid()(而不是获取任何内容)

Python 必须使用UserLoginForm实例作为第一个参数调用unbound方法is_valid()(而不是获取任何内容),python,django,django-class-based-views,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

大家好,任何有想法帮助解决这个错误的人,我正在使用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)

我的错在哪里?“帮助”

您在这里遇到了一些问题,但这正是导致您立即出错的原因:

 form = self.form_class
 ...
 if form.is_valid():
self.form\u类
是对类的引用,而不是表单实例。您应该根据请求构造表单实例,并验证:

form = self.form_class(request.POST)

这将帮助您理解为什么不应该扩展is\u valid方法如果您完全替换它的
post()
方法,那么使用
FormView
也没有意义-您应该挂接到
form\u valid()中
FormView
的祖先提供的其他钩子。如果您要替换
post
,那么关于不使用
FormView
的评论是合理的-在我看来,与纯功能视图相比,基于类的视图对Django的新手来说模糊了太多的逻辑,但是如果你真的想使用它们,你应该努力找出你可以覆盖的最小部分是什么,以获得你想要的行为。