Django调用objects.get报‘Devices匹配查询不存在’问题求助
问题诊断与修复方案
我帮你排查出几个关键问题,正是它们导致了这个"Devices matching query does not exist."错误:
1. URL参数传递不匹配
你的视图函数view_status定义了pk作为路径参数,但你调用时用的是查询参数(?pk=1),这会导致视图里的pk参数始终是None。当你执行Devices.objects.get(pk=pk)时,实际上是在找pk=None的设备,自然会提示不存在。
修复方案二选一:
方案A:改用路径参数传递pk
修改urls.py的URL配置,把pk放到路径里:
url(r'^viewstatus/(?P<pk>\d+)/$', views.view_status, name='ViewStatus'),
调用URL改为:http://localhost:8000/homesite/viewstatus/1/
方案B:从GET查询参数中获取pk
如果坚持用查询参数,修改视图函数,从request.GET里取pk值:
from django.http import Http404 def view_status(request): pk = request.GET.get('pk') if not pk: raise Http404("PK参数缺失") device = Devices.objects.get(pk=pk) return render(request, 'homesite/device_status.html', {'devices': device})
2. 视图返回上下文的格式错误
你当前的render调用直接传了device对象作为上下文,但render要求第三个参数是字典类型。而且模板里用的是devices作为变量名,所以需要把对象包装成键为devices的字典。
修改后的render语句应该是:
return render(request, 'homesite/device_status.html', {'devices': device})
额外的最佳实践建议
- 模型类名建议用单数形式(比如
Device而不是Devices),这是Django的惯例,能避免后续一些混淆。 - 建议用
get_object_or_404替代直接get,这样当对象不存在时会返回更友好的404页面,而不是抛出服务器错误:
from django.shortcuts import get_object_or_404 # 用路径参数的情况 device = get_object_or_404(Devices, pk=pk)
按照上面的步骤修改后,应该就能正常获取到设备对象并在模板中展示了。
内容的提问来源于stack exchange,提问作者Gixxerrider
相关产品推荐
相关产品推荐

