Django调用reverse报错:已设置router basename仍找不到对应路由怎么解决
问题原因
DRF 的路由路由器(SimpleRouter/DefaultRouter)注册 ViewSet 时,生成的路由名称规则为 {basename}-{action},不会直接用 basename 作为独立的路由名称。你注册时指定的 basename 为 organizations,实际生成的标准路由名称为:
- 列表接口(对应 list 动作):
organizations-list - 详情接口(对应 retrieve 动作,需要传主键/唯一标识参数):
organizations-detail
你直接调用reverse('organizations')时,不存在对应名称的路由,因此抛出 NoReverseMatch 错误。
解决步骤
- 先确认你需要跳转的路由对应动作:你当前 reverse 传入了 slug 参数,对应需要的是详情接口,将 reverse 的第一个参数改为
organizations-detail即可,修改后的代码如下:
HttpRequest().build_absolute_uri(reverse('organizations-detail', args=(self.parent_organization.slug,))),
- 如果你不确定生成的路由名称,可以执行以下命令查看项目所有注册路由的完整名称:
python manage.py show_urls
额外注意事项
如果修改后仍报错,需要检查 OrganizationViewSet 中是否配置了 lookup_field = 'slug':ViewSet 默认用 pk 作为详情查询的参数名,如果你用 slug 作为唯一查询键,需要显式指定 lookup_field 为你的 slug 字段名。
内容的提问来源于stack exchange,提问作者Arka-cell
相关产品推荐
相关产品推荐

