使用DefaultRouter时Reverse与HttpResponseRedirect无法正常工作的问题排查
问题原因及解决方案
核心问题
你遇到的NoReverseMatch错误,根源是DRF路由自动生成的URL名称和你使用的名称不匹配,同时你在include(router.urls)时设置的name='product'完全无效。
DRF的DefaultRouter注册视图集后,会自动为每个视图动作生成标准命名的URL,格式为{app_name}:{basename}-{action}:
- 列表页对应
product-list - 详情页对应
product-detail(这正是你需要跳转的产品详情页)
你代码里用的products:product这个名称根本不存在,所以reverse时找不到匹配的路由。
修复步骤
1. 修正URL配置
修改products/urls.py,显式指定basename(避免自动推断出错),同时去掉无效的name='product':
app_name = 'products' router = DefaultRouter() # 显式指定basename,确保生成的URL命名规则稳定 router.register(r'', ProductViewSet, basename='product') urlpatterns = [ path('', include(router.urls)), ]
2. 修正视图中的reverse调用
在bump视图里,把reverse的目标改成正确的URL名称products:product-detail:
@api_view(['POST']) @permission_classes([IsAuthenticated]) def bump(request, pk): product = get_object_or_404(Product, id=pk) product.bumps.add(request.user) # 使用DRF自动生成的详情页URL名称 return HttpResponseRedirect(reverse('products:product-detail', args=[pk]))
额外验证
如果你不确定DRF生成的URL名称,可以运行python manage.py show_urls(需安装django-extensions),或者查看终端启动服务器时输出的路由列表,确认产品详情页的URL名称确实是products:product-detail。
内容的提问来源于stack exchange,提问作者some nooby questions
相关产品推荐
相关产品推荐

