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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:02:27