Django触发ValueError: Field 'id' expected a number but got ''
问题说明
运行Django购物车添加功能时抛出如下错误:
ValueError: Field 'id' expected a number but got ''
错误含义为模型id字段预期接收数字类型值,实际传入了空字符串。
触发原因
错误出在商品查询代码行:producto = Producto.objects.get(pk=request.POST.get('product_id'))
- 发起添加购物车请求时,POST参数中未携带
product_id,或product_id对应值为空字符串,此时request.POST.get('product_id')返回值为'' - Django ORM查询主键(即id字段)时要求传入数字类型参数,接收到空字符串后直接抛出值错误
- 现有代码缺少必要的参数校验逻辑,还存在两个潜在报错点:传入的
product_id不是合法数字、传入id对应的商品不存在,这两类场景同样会触发服务端500错误。
解决方案
后端视图层修复
给接口增加请求方式校验、参数非空校验、格式校验、数据存在性校验,修改后的完整视图代码:
from django.http import HttpResponseBadRequest from .models import Producto # 按项目实际路径导入get_or_create_cart方法 def add(request): # 仅允许POST方式访问接口 if request.method != "POST": return HttpResponseBadRequest("非法请求方式") # 校验必填参数product_id是否存在 product_id = request.POST.get('product_id') if not product_id: return HttpResponseBadRequest("缺少必填商品ID参数") # 校验商品ID格式是否为合法数字 try: product_id = int(product_id) except (TypeError, ValueError): return HttpResponseBadRequest("商品ID格式非法") # 校验对应商品是否存在 try: producto = Producto.objects.get(pk=product_id) except Producto.DoesNotExist: return HttpResponseBadRequest("指定商品不存在") # 执行购物车添加逻辑 cart = get_or_create_cart(request) cart.productos.add(producto) return render(request, 'carts/add.html', { 'producto': producto })
前端传参排查
- 若通过表单提交请求,检查商品ID对应的表单项
name属性是否为product_id,项的value值是否正确绑定商品数字ID,不存在空值情况 - 若通过AJAX异步提交,检查请求体参数名拼写是否正确,是否漏传
product_id字段,字段值是否为非空数字类型。
内容的提问来源于stack exchange,提问作者Tenru
相关产品推荐
相关产品推荐

