You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:09:25