You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:00:04