Django报错未返回HttpResponse对象,提交订单数据无法保存寻求解决方案
Django视图故障排查及修复
核心故障原因
你代码最直接的问题是POST请求下表单验证失败时没有返回HttpResponse对象,这完全符合你描述的触发报错、数据未入库的现象:
Django要求所有视图函数必须返回一个HttpResponse类对象,你当前的逻辑仅覆盖了GET请求、POST且表单验证通过两种场景的返回值,一旦POST提交的内容不符合OrderForm的校验规则,视图就没有返回值,直接触发系统报错,也不会走到订单数据保存的逻辑。
修复代码
将视图代码调整为以下内容,补充表单验证失败场景的返回逻辑,同时加入了开发环境下的错误打印方便定位表单校验问题:
def place_order(request, total=0, quantity=0): current_user = request.user # 如果购物车为空则跳转回商店页 cart_items = CartItem.objects.filter(user=current_user) cart_count = cart_items.count() if cart_count <= 0: return redirect("store") grand_total = 0 tax = 0 for cart_item in cart_items: total += cart_item.product.price * cart_item.quantity quantity += cart_item.quantity tax = (2 * total) / 100 grand_total = total + tax if request.method == "POST": form = OrderForm(request.POST) if form.is_valid(): # 将账单信息存入Order表 data = Order() data.user = current_user data.first_name = form.cleaned_data["first_name"] data.last_name = form.cleaned_data["last_name"] data.phone = form.cleaned_data["phone"] data.email = form.cleaned_data["email"] data.address_line_1 = form.cleaned_data["address_line_1"] data.address_line_2 = form.cleaned_data["address_line_2"] data.country = form.cleaned_data["country"] data.state = form.cleaned_data["state"] data.city = form.cleaned_data["city"] data.order_note = form.cleaned_data["order_note"] data.order_total = grand_total data.tax = tax data.ip = request.META.get("REMOTE_ADDR") data.save() # 生成订单号 yr = int(datetime.date.today().strftime("%Y")) dt = int(datetime.date.today().strftime("%d")) mt = int(datetime.date.today().strftime("%m")) d = datetime.date(yr, mt, dt) current_date = d.strftime("%Y%m%d") order_number = current_date + str(data.id) data.order_number = order_number data.save() return redirect("store") # 表单验证失败处理逻辑 else: # 开发环境可在控制台查看表单校验错误,生产环境注释即可 print(form.errors) return redirect("checkout") else: return redirect("checkout")
其他可选排查点
如果修复上述问题后依然报错,可以按以下顺序排查:
- 确认
datetime模块已经在代码顶部正确导入,避免缺失依赖报错 - 检查
Order模型的字段约束,比如order_number字段长度是否足够存储拼接后的字符串、是否有非空字段没有完成赋值 - 检查数据库的写入权限,确认运行Django服务的账号有权限向Order表写入数据
内容的提问来源于stack exchange,提问作者Aliyasir Naç
相关产品推荐
相关产品推荐

