Django3.2.9 POST请求获取ID触发matching query does not exist错误
错误原因
- 视图中错误使用模板语法:
{{}}是Django模板的专属变量插值语法,仅能在html模板文件中生效,写在Python视图代码中会被当做普通字符串处理。你尝试从POST请求中获取键为'{{customer.id}}'的参数,这个键实际不存在,最终拿到的值为默认的False,用False作为主键查询FilterMaintenance自然匹配不到结果。 - 表单传参逻辑错误:你将FilterMaintenance的ID设置为submit按钮的
name属性,提交后POST请求的参数键为动态的ID值,视图无法预知具体的键名,根本无法正确读取参数。 - 额外隐患:视图中的
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
相关产品推荐
相关产品推荐

