Django访问basket/路径触发404错误,疑与product_detail视图相关问题求助
解决访问/basket/时出现的404错误问题
看起来问题出在Django路由的匹配顺序上,而不是你的basket_summary视图本身。让我一步步拆解:
问题根源
Django在匹配URL时,会按照urlpatterns列表里的顺序从上到下检查。你的core/urls.py里先引入了main_store.urls,再引入basket.urls:
urlpatterns = [ path('admin/', admin.site.urls), path('', include('main_store.urls', namespace='main_store')), # 先匹配这个 path('basket/', include('basket.urls', namespace='basket')), # 后匹配这个 ]
如果你的main_store/urls.py里有一个类似这样的路由(用来匹配商品详情):
path('<slug>/', views.product_detail, name='product_detail')
那么当你访问/basket/时,Django会优先把basket当作<slug>参数,传递给product_detail视图。而你的product_detail视图用get_object_or_404(Product, slug=slug, in_stock=True)去查询商品,显然不存在slug为basket的商品,所以就触发了404错误——这就是你看到的问题,根本没走到basket_summary视图。
解决方案
你有两种简单的修复方式:
方案1:调整路由匹配顺序
把basket的路由放在main_store前面,这样Django会先匹配/basket/路径,再去处理main_store的路由:
urlpatterns = [ path('admin/', admin.site.urls), path('basket/', include('basket.urls', namespace='basket')), # 移到前面 path('', include('main_store.urls', namespace='main_store')), ]
方案2:给商品详情路由添加前缀
修改main_store/urls.py,给商品详情的路由加上明确的前缀(比如products/),避免和其他顶级路径冲突:
# main_store/urls.py urlpatterns = [ # 其他路由... path('products/<slug>/', views.product_detail, name='product_detail'), # 添加前缀 ]
这种方案更规范,能从根源上避免类似的路由冲突问题,推荐使用。
验证
修改后,访问/basket/应该就能正常进入购物车页面了,而商品详情页的访问路径会变成/products/[商品slug]/(如果用方案2的话)。
内容的提问来源于stack exchange,提问作者Delroy Brown
相关产品推荐
相关产品推荐

