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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:31:12