Django注册功能触发MultiValueDictKeyError错误求助
注册流程提交表单时出现MultiValueDictKeyError错误
我开发了一个简单的登录注册项目,在注册流程提交表单并跳转至登录页面时,遇到了MultiValueDictKeyError错误,错误出现在firsname = request.POST['fmyname']这一行。
相关代码
signup.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>sign up here</title> </head> <body> <h3>Sign Up</h3> <form action="/signup" method="POST"> {% csrf_token %} <label for="">username</label> <input type="text" id="username" name="username" placeholder="Create a user name" Required><br> <label for="">first name</label> <input type="text" id="fname" name="fmyname" placeholder="First Name" Required><br> <label for="">last name</label> <input type="text" id="lname" name="lname" placeholder="Last Name" Required><br> <label for="">email</label> <input type="email" id="email" name="email" placeholder="enter your email address" Required><br> <label for="">password</label> <input type="password" id="pass1" name="pass" placeholder="enter your password" Required><br> <label for="">re-enter password</label> <input type="password" id="pass2" name="pass2" placeholder="re enter your password" Required><br><br> <button type="submit">Sign Up</button> </form> </body> </html>
views.py
def signup(request): if request.method == "POST": # username = request.POST.get('username') username = request.POST['username'] firsname = request.POST['fmyname'] #here i got ERROR of the multivaluedictkeyerror lname = request.POST['lname'] email = request.POST['email'] pass1 = request.POST['pass'] pass2 = request.POST['pass2'] myuser = User.objects.create_user(username, email, pass1) myuser.first_name = firsname myuser.last_name = lname myuser.save() messages.success(request, "your account is created.") return redirect('signin') return render(request, 'authentication\signup.html')
错误原因与修复方案
核心问题
直接使用request.POST['key']的方式访问POST数据时,如果请求中不存在对应的key,就会抛出MultiValueDictKeyError。另外代码中还存在两个小问题:变量名firsname拼写错误(应为firstname),以及模板路径使用了反斜杠,可能导致解析异常。
修复后的views.py代码
def signup(request): if request.method == "POST": # 改用get方法获取POST数据,避免key不存在时报错 username = request.POST.get('username') firstname = request.POST.get('fmyname') lname = request.POST.get('lname') email = request.POST.get('email') pass1 = request.POST.get('pass') pass2 = request.POST.get('pass2') # 新增字段非空校验 if not all([username, firstname, lname, email, pass1, pass2]): messages.error(request, "所有字段不能为空") return redirect('signup') # 新增密码一致性校验 if pass1 != pass2: messages.error(request, "两次输入的密码不一致") return redirect('signup') myuser = User.objects.create_user(username, email, pass1) myuser.first_name = firstname myuser.last_name = lname myuser.save() messages.success(request, "你的账户已创建成功") return redirect('signin') # 修正路径分隔符为正斜杠 return render(request, 'authentication/signup.html')
可选优化:统一命名规范
为提升代码可读性,建议修改HTML中first name输入框的name属性为更直观的firstname:
<input type="text" id="fname" name="firstname" placeholder="First Name" Required><br>
同步修改视图中的对应代码:
firstname = request.POST.get('firstname')
内容的提问来源于stack exchange,提问作者khushal
相关产品推荐
相关产品推荐

