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

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>

问题分析

  1. HTML表单缺失name属性:除select标签外,文本、邮箱、电话、textarea输入框均未设置name属性,表单提交时不会携带这些字段数据,直接触发MultiValueDictKeyError。
  2. Views.py多处错误:
    • 未处理GET请求:直接访问/register/时会触发POST字典访问错误
    • 直接用request.POST['key']:键不存在时直接抛异常,应改用request.POST.get('key')并做判断
    • 导入错误:导入了Django自带User模型,而非自定义的user模型
    • 错误调用模型方法:自定义模型无create_useryou方法,应使用默认的create()
    • 字段名不匹配:模型中是phone和Email,视图里却用了phone_number和email
  3. Model层不规范:
    • 类名不符合PEP8规范:应首字母大写为User(避免冲突可改为CustomUser)
    • 字段名大小写不一致:Email大写开头,其他字段小写,建议统一为小写email

修复步骤及代码

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)}'})

验证修复

  1. 执行迁移命令更新数据库结构
  2. 访问注册页面,填写表单提交
  3. 检查数据库是否新增记录,同时不再触发MultiValueDictKeyError

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:50:56