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属性,同时修正两处细节问题:
- 标签的
for属性与input的id值对应,提升交互体验 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
相关产品推荐
相关产品推荐

