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

如何修复Django中的MultiValueDictKeyError错误

Django表单提交报错MultiValueDictKeyError: 'listname' 解决方法

问题场景

表单代码

<h1>ADD LIST</h1>
<form action="addList/" method="post">
    {% csrf_token %}
    <div class = "container">
        <label>List Name</label><br>
        <input  name="listname" class= "listNamec"><br><br></input>
        <label>List title</label><br>
        <input name="listtitle"  class= "listTitlec"><br><br></input>  
    </div>
</form>

视图函数代码

def addList(response):
    listname = response.POST['listname']
    list.name = listname
    list.save()
    return render(response, 'main/index.html', {})

错误信息

raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'listname'

错误原因

  1. 表单无提交按钮:当前表单缺少触发提交的按钮,用户无法发送POST请求,视图可能接收到GET请求,此时request.POST为空字典,直接取值会报错。
  2. 视图未判断请求方法:不管是GET还是POST请求,视图都直接读取request.POST数据,GET请求时必然不存在对应键。
  3. 模型操作错误:直接操作list.name是错误的,list是Python内置类型,需要实例化你定义的Todolist模型类来创建数据库记录。

修复步骤及代码

1. 给表单添加提交按钮

修改表单代码,添加提交按钮以触发POST请求:

<h1>ADD LIST</h1>
<form action="addList/" method="post">
    {% csrf_token %}
    <div class = "container">
        <label>List Name</label><br>
        <input name="listname" class= "listNamec"><br><br>
        <label>List title</label><br>
        <input name="listtitle" class= "listTitlec"><br><br>
        <!-- 添加提交按钮 -->
        <button type="submit">添加列表</button>
    </div>
</form>

(注:input是自闭合标签,无需</input>,可直接删除)

2. 修改视图函数,正确处理请求与模型操作

先确保已导入Todolist模型,再修改视图:

from django.shortcuts import render
from .models import Todolist  # 导入你的Todolist模型

def addList(response):
    # 仅在POST请求时处理表单数据
    if response.method == 'POST':
        # 使用.get()方法避免KeyError,同时获取表单字段值
        listname = response.POST.get('listname')
        listtitle = response.POST.get('listtitle')
        
        # 简单校验数据不为空后,实例化模型并保存到数据库
        if listname and listtitle:
            new_list = Todolist(name=listname, title=listtitle)
            new_list.save()
    
    return render(response, 'main/index.html', {})

额外说明

  • 使用request.POST.get('key')替代直接取值,键不存在时返回None,避免抛出MultiValueDictKeyError。
  • 建议添加更完善的表单校验逻辑,比如字段长度限制、格式校验等,保证数据合法性。
  • 确保urls.py中已正确配置addList/路由,指向该视图函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:45:39