Django Web应用PK相关404错误排查:详情与更新页异常
Django详情页/更新页404错误排查(No storage found matching the query)
问题概述
访问descript/<int:pk>/和change-info/<int:pk>页面时触发404错误,提示No storage found matching the query,其余页面可正常访问。
排查与修复步骤
1. 确认数据库中存在对应PK的Storage记录
这是触发该404最直接的原因:你访问的pk=1可能根本不存在于数据库中。
- 验证方式:
- 通过Django admin后台查看
Storage模型的所有记录,确认是否有id=1的条目。 - 或使用Django Shell执行查询:
- 通过Django admin后台查看
python manage.py shell from base.models import Storage # 检查pk=1的记录是否存在 print(Storage.objects.filter(pk=1).exists())
如果返回False,需先创建对应记录再访问页面。
2. 修复UpdateView类的代码错误
你的UpdateInfo类中缺失了success_url的赋值语句,虽然这不会直接导致404,但属于语法错误,必须修正:
# views.py中修改UpdateInfo类 class UpdateInfo(UpdateView): model = Storage fields = '__all__' success_url = reverse_lazy('list') # 补充赋值语句,原代码仅写了reverse_lazy('list')
3. 处理查询集的用户过滤(可选但推荐)
由于Storage模型包含user外键,默认的DetailView和UpdateView会查询所有Storage记录,若当前登录用户与目标记录的user不匹配(或记录未关联用户),也可能触发404。建议重写get_queryset方法确保数据隔离:
# views.py中引入LoginRequiredMixin并修改视图类 from django.contrib.auth.mixins import LoginRequiredMixin class Information(LoginRequiredMixin, DetailView): model = Storage template_name = 'base/storage_detail.html' def get_queryset(self): # 仅返回当前登录用户的Storage记录 return Storage.objects.filter(user=self.request.user) class UpdateInfo(LoginRequiredMixin, UpdateView): model = Storage fields = '__all__' success_url = reverse_lazy('list') def get_queryset(self): return Storage.objects.filter(user=self.request.user)
注:如果你的应用允许未登录用户访问记录,可暂时移除LoginRequiredMixin,但需注意数据安全。
4. 统一URL路径的斜杠格式
你的change-info/<int:pk>路径末尾未加斜杠,虽然Django默认的APPEND_SLASH设置会自动重定向,但为了和其他URL保持一致,建议补充斜杠:
# urls.py中修改change-info的路径 path('change-info/<int:pk>/', UpdateInfo.as_view(), name='change-info')
总结
优先确认数据库中是否存在对应PK的记录,这是解决该问题的核心。其次修复代码中的语法错误,并根据业务需求添加数据过滤逻辑,最后统一URL格式避免潜在问题。
内容的提问来源于stack exchange,提问作者Tolu
相关产品推荐
相关产品推荐

