Django注册接口MultiValueDictKeyError及数据入库失败求助
Django注册功能报错排查与解决
问题概述
通过POST方法获取用户提交的注册信息时,/register/路径触发MultiValueDictKeyError('name'键缺失),同时提交的数据无法写入数据库,Model层也存在错误。
报错信息
Internal Server Error: /register/ Traceback (most recent call last): File "J:\good\test\Lib\site-packages\django\utils\datastructures.py", line 84, in __getitem__ list_ = super().__getitem__(key) ^^^^^^^^^^^^^^^^^^^^^^^^ KeyError: 'name' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "J:\good\test\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner response = get_response(request) ^^^^^^^^^^^^^^^^^^^^^ File "J:\good\test\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "J:\good\mainone\threeapp\views.py", line 22, in register name=request.POST['name'] ~~~~~~~~~~~~^^^^^^^^ File "J:\good\test\Lib\site-packages\django\utils\datastructures.py", line 86, in __getitem__ raise MultiValueDictKeyError(key) django.utils.datastructures.MultiValueDictKeyError: 'name'
相关代码
model.py
from django.db import models # Create your models here. class user(models.Model): name = models.CharField(max_length=30) Email= models.EmailField(max_length=254) phone= models.IntegerField() account = models.CharField(max_length=10) message = models.CharField(max_length=300)
views.py
from django.shortcuts import render,redirect from django.contrib.auth.models import User # Create your views here. def index(request): return render(request,"index.html") def contact(request): return render(request,"contact.html") def ideagained(request): return render(request,"idea_gained.html") def idea(request): return render(request,"idea.html") def ouridea(request): return render(request,"our_idea.html") def aboutpage(request): return render(request,"aboutpage.html") def register(request): name=request.POST['name'] email=request.POST['email'] phone=request.POST['phone_number'] account=request.POST['account'] message=request.POST['message'] user=user.objects.create_useryou(name=name, email=email, phone_number=phone, account=account, message=message) print("we wil call back you") return redirect('/')
HTML表单代码
<form action="{% url "register" %}" method="post"> {% csrf_token %} <h3>my information</h3> <h4>Contact us today, and get reply with in 24 hours!</h4> <style> fieldset { border: medium none !important; text-emphasis-color:black; margin: 0 0 10px; min-width: 100%; padding: 0; width: 100%;F } </style> <fieldset> <input placeholder="Your_name" type="text" tabindex="1" style="background-color:black;" required autofocus> </fieldset><br> <fieldset> <input placeholder="Your Email Address" type="email" tabindex="2" style="background-color:black;" required> </fieldset><br> <fieldset> <input placeholder="Your Phone Number" type="tel" tabindex="3" style="background-color:black;" required> </fieldset><br> <fieldset> <label for="cars">Choose a account:</label> <select name="account" id="name"> <option value="netflix">netflix</option> <option value="amazone prime">amazone</option> <option value="disney plus hotstar">hotstar</option> </select> <style> #nname { padding: 5px; color: #f7f7f8; font-size: 12px; background: black; appearance: none; } </style> </fieldset><br> <fieldset> <textarea placeholder="Type your Message Here...." tabindex="5" style="background-color:black;" required></textarea> </fieldset><br> <fieldset> <button name="submit" type="submit" id="contact-submit" style="background-color:rgb(23, 12, 12);" data-submit="...Sending" value="submit">Submit</button> </fieldset><br> </form>
问题分析
- HTML表单缺失name属性:除select标签外,文本、邮箱、电话、textarea输入框均未设置
name属性,表单提交时不会携带这些字段数据,直接触发MultiValueDictKeyError。 - Views.py多处错误:
- 未处理GET请求:直接访问
/register/时会触发POST字典访问错误 - 直接用
request.POST['key']:键不存在时直接抛异常,应改用request.POST.get('key')并做判断 - 导入错误:导入了Django自带
User模型,而非自定义的user模型 - 错误调用模型方法:自定义模型无
create_useryou方法,应使用默认的create() - 字段名不匹配:模型中是
phone和Email,视图里却用了phone_number和email
- 未处理GET请求:直接访问
- Model层不规范:
- 类名不符合PEP8规范:应首字母大写为
User(避免冲突可改为CustomUser) - 字段名大小写不一致:
Email大写开头,其他字段小写,建议统一为小写email
- 类名不符合PEP8规范:应首字母大写为
修复步骤及代码
1. 修复HTML表单:添加name属性
给所有输入项添加对应name属性,确保提交键与视图获取的一致:
<form action="{% url "register" %}" method="post"> {% csrf_token %} <h3>my information</h3> <h4>Contact us today, and get reply with in 24 hours!</h4> <style> fieldset { border: medium none !important; margin: 0 0 10px; min-width: 100%; padding: 0; width: 100%; } </style> <fieldset> <input placeholder="Your_name" type="text" name="name" tabindex="1" style="background-color:black;" required autofocus> </fieldset><br> <fieldset> <input placeholder="Your Email Address" type="email" name="email" tabindex="2" style="background-color:black;" required> </fieldset><br> <fieldset> <input placeholder="Your Phone Number" type="tel" name="phone" tabindex="3" style="background-color:black;" required> </fieldset><br> <fieldset> <label for="account">Choose a account:</label> <select name="account" id="account"> <option value="netflix">netflix</option> <option value="amazone prime">amazone</option> <option value="disney plus hotstar">hotstar</option> </select> <style> #account { padding: 5px; color: #f7f7f8; font-size: 12px; background: black; appearance: none; } </style> </fieldset><br> <fieldset> <textarea placeholder="Type your Message Here...." name="message" tabindex="5" style="background-color:black;" required></textarea> </fieldset><br> <fieldset> <button name="submit" type="submit" id="contact-submit" style="background-color:rgb(23, 12, 12);" data-submit="...Sending" value="submit">Submit</button> </fieldset><br> </form>
2. 修复Model.py:规范命名和字段
from django.db import models class CustomUser(models.Model): name = models.CharField(max_length=30) email = models.EmailField(max_length=254) phone = models.IntegerField() account = models.CharField(max_length=10) message = models.CharField(max_length=300) def __str__(self): return self.name
执行迁移命令更新数据库结构:
python manage.py makemigrations python manage.py migrate
3. 修复Views.py:处理请求、正确操作模型
from django.shortcuts import render,redirect from .models import CustomUser def index(request): return render(request,"index.html") def contact(request): return render(request,"contact.html") def ideagained(request): return render(request,"idea_gained.html") def idea(request): return render(request,"idea.html") def ouridea(request): return render(request,"our_idea.html") def aboutpage(request): return render(request,"aboutpage.html") def register(request): if request.method == 'GET': return render(request, 'contact.html') elif request.method == 'POST': name = request.POST.get('name') email = request.POST.get('email') phone = request.POST.get('phone') account = request.POST.get('account') message = request.POST.get('message') if not all([name, email, phone, account, message]): return render(request, 'contact.html', {'error': '所有字段都为必填项'}) try: CustomUser.objects.create( name=name, email=email, phone=phone, account=account, message=message ) print("we will call back you") return redirect('/') except Exception as e: return render(request, 'contact.html', {'error': f'提交失败:{str(e)}'})
验证修复
- 执行迁移命令更新数据库结构
- 访问注册页面,填写表单提交
- 检查数据库是否新增记录,同时不再触发
MultiValueDictKeyError
内容的提问来源于stack exchange,提问作者jeeva
相关产品推荐
相关产品推荐

