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

Django注册页面触发MultiValueDictKeyError错误求助

Django注册系统MultiValueDictKeyError错误修复

问题描述

开发Django登录注册系统时,访问/signup提交表单后触发MultiValueDictKeyError,错误提示为'uname'。

相关代码

views.py

from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth.models import User
from django.contrib import messages


def home(request):
    return render(request, "authentication/index.html")


def signup(request):
    if request.method == "POST":
        uname = request.POST['uname']
        fname =request.POST['fname']
        lname = request.POST['lname']
        email = request.POST['email']
        pass1 = request.POST['pass1']
        pass2 = request.POST['pass2']

        myuser = User.objects.create_user(uname, email, pass1)
        myuser.first_name = fname
        myuser.last_name = lname

        myuser.save()

        messages.success(request, "Your account has been successfully created.")

        return redirect('signin')

    return render(request, "authentication/signup.html")


def signin(request):
    return render(request, "authentication/signin.html")


def signout(request):
    pass

signup.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Database</title>
</head>
<body>

        <h3>Sign Up</h3>
        <form action="/signup" method="post">
            {% csrf_token %}
            <label for="">Username</label>
            <input type="text" id="uname" placeholder="Create a username", Required>
            <br>

            <label for="">First Name</label>
            <input type="text" id="fname" placeholder="Enter First Name", Required>
            <br>

            <label for="">Last Name</label>
            <input type="text" id="lname" placeholder="Enter Last name", Required>
            <br>

            <label for="">Email</label>
            <input type="email" id="email" placeholder="Enter Email address", Required>
            <br>

            <label for="">Password</label>
            <input type="password" id="pass1" placeholder="Create a Password", Required>
            <br>

            <label for="">Confirm your password</label>
            <input type="password" id="pass2" placeholder="Confirm your password", Required>
            <br>

            <button type="submit">Sign Up</button>

        </form>

</body>
</html>

错误信息

MultiValueDictKeyError at /signup
"'uname'"

Request Method:   POST
Request URL:  http://127.0.0.1:8000/signup
Django Version:   3.2.15
Exception Type:   MultiValueDictKeyError
Exception Value:  

"'uname'"

Exception Location:   /home/im-lp-1841/PycharmProjects/Database/venv/lib/python3.7/site-packages/django/utils/datastructures.py, line 78, in __getitem__
Python Executable:    /home/im-lp-1841/PycharmProjects/Database/venv/bin/python
Python Version:   3.7.12
Python Path:

['/home/im-lp-1841/PycharmProjects/Database',
 '/home/im-lp-1841/PycharmProjects/Database',
 '/usr/lib/python37.zip',
 '/usr/lib/python3.7',
 '/usr/lib/python3.7/lib-dynload',
 '/home/im-lp-1841/PycharmProjects/Database/venv/lib/python3.7/site-packages']

Server time:  Fri, 30 Sep 2022 06:31:12 +0000

解决方法

错误核心原因:HTML表单的<input>标签仅设置了id属性,未添加name属性。Django通过request.POST获取表单数据时,是依据name属性而非id来匹配键值对的。

修改signup.html中的所有input标签,补充对应的name属性,同时修正两处细节问题:

  1. 标签的for属性与input的id值对应,提升交互体验
  2. Required改为小写required,符合HTML标准属性写法

修改后的input代码示例:

<label for="uname">Username</label>
<input type="text" id="uname" name="uname" placeholder="Create a username" required>
<br>

<label for="fname">First Name</label>
<input type="text" id="fname" name="fname" placeholder="Enter First Name" required>
<br>

<label for="lname">Last Name</label>
<input type="text" id="lname" name="lname" placeholder="Enter Last name" required>
<br>

<label for="email">Email</label>
<input type="email" id="email" name="email" placeholder="Enter Email address" required>
<br>

<label for="pass1">Password</label>
<input type="password" id="pass1" name="pass1" placeholder="Create a Password" required>
<br>

<label for="pass2">Confirm your password</label>
<input type="password" id="pass2" name="pass2" placeholder="Confirm your password" required>
<br>

修改完成后重新提交表单,即可正常获取request.POST中的数据,错误将被修复。


内容的提问来源于stack exchange,提问作者ISMAIL MULLA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:40:29