Django HttpResponseRedirect跳转失败及Category查询不存在问题求助
问题解决:CS50 Commerce 创建列表时 Category 不存在错误
问题描述
在完成CS50 Project2 Commerce项目时,点击创建新列表的提交按钮后无法跳转到index页面,触发错误:auctions.models.Category.DoesNotExist: Category matching query does not exist
但通过admin页面可以正常添加分类。
错误原因
问题出在前端表单的分类下拉框配置:
在create.html的下拉选项中,<option>的value被写死为字符串"category",而非当前循环的分类实际名称。这导致表单提交时,后端收到的category参数永远是"category",而数据库中不存在该名称的分类,进而Category.objects.get(categoryName=category)查询失败抛出异常。
修复方案
方案1:传递分类名称(匹配现有后端逻辑)
修改create.html中的下拉选项代码:
<!-- 原代码 --> <option value="category">{{category}}</option> <!-- 修改后 --> <option value="{{category.categoryName}}">{{category}}</option>
方案2:传递分类ID(更稳定,避免名称重复问题)
如果你的Category模型包含id字段,推荐用ID查询,更可靠:
- 修改
views.py中的分类查询逻辑:
# 原代码 category = request.POST["category"] categoryData = Category.objects.get(categoryName=category) # 修改后 category_id = request.POST["category"] categoryData = Category.objects.get(id=category_id)
- 修改
create.html中的下拉选项:
<!-- 原代码 --> <option value="category">{{category}}</option> <!-- 修改后 --> <option value="{{category.id}}">{{category}}</option>
额外优化:添加异常处理
为了避免因其他意外情况导致的查询失败,建议给get方法添加异常捕获:
from django.contrib import messages # 在else分支中修改查询部分 try: categoryData = Category.objects.get(categoryName=category) # 或对应方案2的id查询 except Category.DoesNotExist: messages.error(request, "所选分类不存在,请重新选择") return HttpResponseRedirect(reverse("create"))
内容的提问来源于stack exchange,提问作者bambi
相关产品推荐
相关产品推荐

