Django T恤商城加购时报Field 'id' expected a number错误如何解决
问题根本原因
Django的URL路由规则是从上到下优先匹配,你当前的urls.py配置存在两个问题:
- 无类型限制的
<id>路由写在了<slug:slug>路由前面,<id>默认会匹配所有不含斜杠的字符串,加购请求传入的商品slug(比如woodstock)会被优先匹配到remove_from_cart视图,而不是你预期的add_to_cart视图 remove_from_cart的id参数没有指定int类型,会直接接收字符串格式的slug,调用CartItem.objects.get(id=id)的时候自然就会抛出「期望数字但得到字符串」的报错,你看到的remove_from_cart里打印id为商品名称也是这个原因。
可行解决方案
第一步:调整urls.py的路由配置
修改购物车模块的urls.py,一是调整路由顺序,二是给删除接口加专属路径、给id指定int类型,彻底避免匹配冲突:
app_name='carts' urlpatterns =[ path('cart/', views.view, name='cart'), # 规则更精确的加购路由放在前面 path('cart/<slug:slug>/', views.add_to_cart, name='add_to_cart'), # 给删除路由加专属前缀,同时指定id为int类型,只会匹配数字参数 path('cart/remove/<int:id>/', views.remove_from_cart, name='remove_from_cart'), ]
第二步:无需修改其他代码
路由的name属性没有变化,模板里的删除链接{% url "carts:remove_from_cart" item.id %}会自动适配新的路由规则,不需要调整模板、视图代码。
这个问题属于路由逻辑错误,和数据库迁移无关,所以删除迁移文件的操作不会生效。
内容的提问来源于stack exchange,提问作者Mike1982
相关产品推荐
相关产品推荐

