使用cleaned_data无法获取正确数据:Django登录表单问题
问题分析与修复方案
嘿,我一眼就揪出你代码里的两个关键小问题,这就是你没法正确获取cleaned_data数据的根源:
1. 拼写错误:cleaned_form → cleaned_data
在views.py里,你打印form.cleaned_data是完全正确的,但后面获取用户名和密码时却写错了属性名——把cleaned_data写成了cleaned_form!Django表单验证后,清洗好的数据是存在cleaned_data这个字典里的,写错名字自然拿不到值。
2. 表单提交方法错误:action="POST" → method="POST"
你的login.html里form标签写了action="POST",这完全搞混了属性的作用:
action是用来指定表单提交的目标URLmethod才是设置HTTP请求方法的属性,要提交POST请求必须写method="POST"
如果不改这个,表单会默认用GET方法提交,不仅数据会暴露在URL里,还会导致form.is_valid()验证失败(Django表单默认只处理POST请求的数据)。
修正后的完整代码:
views.py
def login_page(request): form = LoginForm(request.POST or None) context = { 'form': form } if form.is_valid(): print(form.cleaned_data) # 修正:将cleaned_form改为cleaned_data username = form.cleaned_data.get("username") password = form.cleaned_data.get("password") user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect("/") else: print("Error: Invalid username or password") return render(request, "auth/login.html", context)
login.html
<!-- 修正:将action="POST"改为method="POST" --> <form method="POST">{% csrf_token %} {{ form }} <button type="submit" class="btn btn-default">Submit</button> </form>
额外小提示:
你可以直接通过键名从cleaned_data取值,比如username = form.cleaned_data["username"],但用.get()方法会更安全——如果某个字段意外缺失,.get()会返回None而不是抛出KeyError异常。
内容的提问来源于stack exchange,提问作者Mohammad Mre3
相关产品推荐
相关产品推荐

