Django中MultiValueDictKeyError('name')错误解决求助
错误核心原因
报错信息:
MultiValueDictKeyError at /gf/
'name'
Request Method: GET
Request URL: http://127.0.0.1:8000/gf/?age=28&csrfmiddlewaretoken=0NribXMzevzOMqH3YoYiK65wqODRNRj3oiKBT50X5NK4BTi7j87UhMTRndTpz8S5
Django Version:4.2
Exception Type:MultiValueDictKeyError
Exception Value:'name'
本次错误的直接诱因是路由配置错误:在urls.py中,/gf/路径错误指向了age_view函数,而非对应的gf_view。当提交age.html表单到/gf/时,age_view会尝试从GET请求中获取name参数,但此时请求仅携带age参数,直接用下标取值触发了MultiValueDictKeyError。
另外你提到的表单name属性问题无需担心:Django表单生成的input标签默认会使用字段名作为name属性(比如Nameform的name字段对应的input标签name就是name),这不是本次错误的原因。
修复步骤
1. 修正路由配置
修改urls.py中/gf/对应的视图函数:
from django.urls import path from . import views urlpatterns = [ path('name/',views.name_view,name='name'), path('age/',views.age_view,name='age'), path('gf/',views.gf_view,name='gf'), # 修正此处,指向正确的gf_view path('result/',views.result_view,name='result') ]
2. 优化视图参数获取逻辑(可选但推荐)
直接用request.GET['key']会在key不存在时触发报错,建议改用.get()方法,避免程序崩溃:
# views.py中修改各视图函数 def age_view(request): form=AgeForm() name=request.GET.get('name') # 不存在时返回None if name: request.session['name']=name return render(request,'age.html',{'form':form}) def gf_view(request): form=GFForm() age=request.GET.get('age') if age: request.session['age']=age return render(request,'gf.html',{'form':form}) def result_view(request): gf=request.GET.get('gf') if gf: request.session['gf']=gf return render(request,'result.html')
3. 修复模板语法错误
result.html中存在过滤器语法错误,将{{value:title}}改为{{value|title}}:
<li><h2>{{key|upper}}:{{value|title}}</h2></li>
额外优化建议
你的逻辑中已经用session存储了之前提交的name,后续视图无需再从GET参数中获取,直接从session读取更合理,比如:
def gf_view(request): form = GFForm() age = request.GET.get('age') if age: request.session['age'] = age # 直接从session获取已存储的name,无需依赖GET参数 stored_name = request.session.get('name') return render(request,'gf.html',{'form':form, 'stored_name': stored_name})
内容的提问来源于stack exchange,提问作者Sanketkumar7

