Django提交创建文章表单时出现MultiValueDictKeyError错误如何解决?
解决Django提交表单时的MultiValueDictKeyError: "'title'"问题
这个错误本质上是Django找不到POST请求里的'title'字段,哪怕你已经给输入框加了name="title",咱们一步步来排查解决:
1. 先确认前端是否真的发送了title数据
这是最关键的一步,别光看模板代码,要实际验证浏览器发送的请求:
- 打开浏览器开发者工具(F12),切换到「Network」标签
- 点击表单的「Publish」按钮提交
- 在Network列表里找到对应的POST请求,点击后查看「Form Data」部分
- 如果这里没有
title字段,说明前端模板的修改没生效:- 强制刷新页面(Ctrl+F5),清除浏览器缓存,确保加载最新的模板
- 右键查看页面源代码,确认输入框的HTML里确实存在
name="title"属性
2. 用更安全的方式获取POST数据
直接用request.POST['title']的问题在于,如果字段缺失会直接抛出异常,推荐用get()方法,这样即使字段不存在也只会返回None,还能设置默认值,同时可以添加输入验证:
修改views.py里的POST处理逻辑:
elif request.method == "POST": title = request.POST.get('title', '').strip() content = request.POST.get('content', '').strip() # 验证输入是否为空 if not title or not content: context = {'b': block, 'error_msg': '标题和内容不能为空!'} return render(request, "article/create_article.html", context) # 注意:Article模型里的author字段是必填项,当前代码没赋值会触发数据库错误! article = Article( block=block, title=title, content=content, status=0, author="默认作者" # 建议从登录用户获取,比如request.user.username ) article.save() return redirect(f"article/list/{ block_id }")
3. 检查模板和路由的匹配
- 避免硬编码表单action路径,用Django的
url标签生成更可靠:
把模板里的action改成:
同时在<form class="form-horizontal" action="{% url 'create_article' b.id %}" method="POST">urls.py里给路由命名:from django.urls import path from . import views urlpatterns = [ # 其他路由... path('article/create/<int:block_id>/', views.create_article, name='create_article'), path('article/list/<int:block_id>/', views.article_list, name='article_list'), ] - 如果是生产环境,Django会缓存模板,修改后需要重启服务才能生效。
4. 排查是否有JS干扰表单提交
如果页面里有自定义JavaScript代码,可能会阻止表单默认提交行为或修改表单数据,导致title字段没被发送。可以暂时禁用页面JS,测试提交是否正常。
内容的提问来源于stack exchange,提问作者Wizard
相关产品推荐
相关产品推荐

