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

Django3.2.9 POST请求获取ID触发matching query does not exist错误

错误原因
  1. 视图中错误使用模板语法:{{}}是Django模板的专属变量插值语法,仅能在html模板文件中生效,写在Python视图代码中会被当做普通字符串处理。你尝试从POST请求中获取键为'{{customer.id}}'的参数,这个键实际不存在,最终拿到的值为默认的False,用False作为主键查询FilterMaintenance自然匹配不到结果。
  2. 表单传参逻辑错误:你将FilterMaintenance的ID设置为submit按钮的name属性,提交后POST请求的参数键为动态的ID值,视图无法预知具体的键名,根本无法正确读取参数。
  3. 额外隐患:视图中的x变量仅在POST请求分支中定义,当用户以GET方式访问页面时,渲染模板时会找不到x变量,抛出NameError异常。
解决方法

第一步:修改模板传参逻辑

用隐藏input字段固定参数键名,明确传递FilterMaintenance的ID,将index.html里的表单部分替换为以下代码:

<td>
  <form action="" method="post">
    {% csrf_token %}
    <input type="hidden" name="filtermaintenance_id" value="{{customer.id}}">
    <input type="submit" value="Done">
  </form>
</td>

第二步:修改视图查询逻辑

修正参数读取逻辑,同时提前定义变量默认值避免GET请求报错,views.py修改后代码如下:

from django.shortcuts import get_object_or_404
from .models import Customer,FilterMaintenance

def index(request):
    x = None  # 提前定义默认值,解决GET请求变量不存在的问题
    if request.method == "POST":
        # 读取隐藏字段传递的ID
        fm_id = request.POST.get('filtermaintenance_id')
        # 安全查询,不存在时返回404,也可以用try except捕获DoesNotExist异常自定义处理逻辑
        filtermaintenance_obj = get_object_or_404(FilterMaintenance, pk=fm_id)
        x = filtermaintenance_obj.filter_last_due_date
    f = FilterMaintenance.objects.all()
    return render(request,'maintenance/index.html',{        
        "customers_maintenance":f,
        "test":x
    })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:36:04