Python 必须使用UserLoginForm实例作为第一个参数调用unbound方法is_valid()(而不是获取任何内容)
大家好,任何有想法帮助解决这个错误的人,我正在使用Django框架使用基于类的视图开发一个简单的应用程序 以下是我的视图代码: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
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的新手来说模糊了太多的逻辑,但是如果你真的想使用它们,你应该努力找出你可以覆盖的最小部分是什么,以获得你想要的行为。