Django中MultiValueDictKeyError报错排查:用户选择查询功能异常
问题分析与修复方案
你的MultiValueDictKeyError主要来自两个核心问题,再加上一些逻辑小bug,我帮你逐一拆解:
1. 表单字段名匹配错误(直接触发KeyError)
看你的HTML代码,供应商选择的单选按钮name属性是inlineDefaultRadiosExample,但在views.py里你错误地用inlineDefaultRadiosExample1去获取供应商选项:
# 错误代码: vendor_choice = request.POST["inlineDefaultRadiosExample1"] # 应该是inlineDefaultRadiosExample date_choice = request.POST["inlineDefaultRadiosExample1"] # 这个是正确的,但上面的供应商字段名写错了
另外,直接用request.POST[key]的方式,如果用户漏选某个单选按钮(比如没选时间范围),会直接抛出MultiValueDictKeyError——因为该键不存在于POST数据中。正确的做法是用.get()方法,同时设置默认值避免报错。
2. 时间范围判断逻辑重复+类型不匹配
你写了两个elif date_choice == 1,这会导致第二个条件永远不会触发;同时request.POST获取到的值是字符串类型,用整数1比较会不匹配:
# 错误代码: if date_choice == 1: d = transaction.objects.filter(...) elif date_choice == 1: # 这里应该对应值为2的选项 d = transaction.objects.filter(...)
3. Transaction模型字段名不一致
你的transaction模型里关联供应商的字段是vendor_id,但代码里写了ven_id=y,这会导致ORM查询报错,需要统一成vendor_id=y。
修正后的完整代码
views.py
from django.shortcuts import render from .models import employee, vendor, transaction import datetime def admin_login_view(request): # 替换成你实际的视图函数名 if 'form1' in request.POST: # 用get方法获取字段,避免KeyError,同时设置默认值 vendor_choice = request.POST.get("inlineDefaultRadiosExample", None) date_choice = request.POST.get("inlineDefaultRadiosExample1", None) # 先做合法性校验,避免空值导致后续报错 if not vendor_choice or not date_choice: return render(request, 'profiles/adminKaLogin.html', {'error': '请选择供应商和时间范围'}) try: x = employee.objects.get(name=request.user) y = vendor.objects.get(id=vendor_choice) # 字符串与字符串比较,匹配表单提交的类型 if date_choice == '1': d = transaction.objects.filter(vendor_id=y, emp_id=x, timestamp__gte=datetime.date.today() - datetime.timedelta(days=30)) elif date_choice == '2': d = transaction.objects.filter(vendor_id=y, emp_id=x, timestamp__gte=datetime.date.today() - datetime.timedelta(days=60)) elif date_choice == '6': d = transaction.objects.filter(vendor_id=y, emp_id=x, timestamp__gte=datetime.date.today() - datetime.timedelta(days=180)) else: # 兜底处理非法的时间选项 d = transaction.objects.none() return render(request, 'profiles/adminKaLogin.html', {'model': d}) except (employee.DoesNotExist, vendor.DoesNotExist): # 处理用户或供应商不存在的异常 return render(request, 'profiles/adminKaLogin.html', {'error': '无效的用户或供应商信息'}) # GET请求时返回空页面 return render(request, 'profiles/adminKaLogin.html')
额外优化建议:HTML添加默认选中项
为了避免用户漏选,给供应商和时间范围的单选按钮各加一个checked属性,比如:
<!-- 供应商默认选中第一个 --> <input type="radio" class="custom-control-input" id="defaultInline1" name="inlineDefaultRadiosExample" value="1" checked> <!-- 时间范围默认选中第一个 --> <input type="radio" class="custom-control-input" id="defaultInlines1" name="inlineDefaultRadiosExample1" value="1" checked>
内容的提问来源于stack exchange,提问作者DHRUV KAUSHAL
相关产品推荐
相关产品推荐

