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

使用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是用来指定表单提交的目标URL
  • method才是设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:07:48