Django登录开发报错:LoginForm无cleaned_data属性如何解决
报错根因
Django表单的cleaned_data属性,只有在调用is_valid()方法完成表单校验后才会生成。你视图代码中写的是if form.is_valid:,缺少方法调用的括号,本质只是引用了方法对象,没有真正执行校验逻辑,表单不会生成cleaned_data属性,访问时就会抛出属性不存在的错误。
另外你定义的LoginForm继承自forms.Form,内部的Meta类属于冗余代码,不会触发本次报错,但可以删除精简代码。
修复步骤
- 修改视图中的表单校验逻辑,给
is_valid补上括号,触发实际校验流程。 - (可选)补充校验不通过的分支逻辑,方便给用户返回提示。
修复后的views.py对应代码如下:
def login_view(request): template_name = 'main/login.html' action_detail = '' if request.method == "POST": form = LoginForm(request.POST) # 补全括号,执行表单校验 if form.is_valid(): username = form.cleaned_data.get('user_name') password = form.cleaned_data.get('passWord') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('/') else: action_detail = 'invalid username or password' # 可选:校验不通过时的提示 else: action_detail = '表单输入格式不符合要求' else: form = LoginForm() context={ 'title': 'Login', 'form': form, 'action_detail': action_detail, } return render(request, template_name, context)
可选精简后的forms.py代码(删除无效Meta类,功能完全不变):
class LoginForm(forms.Form): user_name = forms.CharField(max_length=20, widget=TextInput(attrs={'type':'text','class': 'form-control','placeholder': 'Input username'})) passWord = forms.CharField(max_length=25, widget=TextInput(attrs={'type':'password','class': 'form-control','placeholder': 'Input password'}))
改完之后重启服务,表单提交时会正常走校验流程,就能正常访问cleaned_data获取校验后的值了。
内容的提问来源于stack exchange,提问作者spekan
相关产品推荐
相关产品推荐

