使用DRF DefaultRouter时无法通过reverse获取URL
问题解决:Reverse for 'notes' not found
当使用Django REST Framework的DefaultRouter注册ModelViewSet时,路由系统会自动生成多个URL模式,每个模式都有特定的命名规则,不能直接用注册的前缀名称(比如这里的notes)来执行reverse。
错误原因
DefaultRouter为NoteModelViewSet生成的URL名称带有固定后缀:
- 获取所有notes的列表视图,对应名称是
notes-list - 单个note的详情视图(含GET/PUT/PATCH/DELETE操作),对应名称是
notes-detail - 其他动作也会生成对应命名,比如
notes-create
你直接调用reverse('notes')找不到匹配路由,因为这个名称并不存在。
解决方案
- 使用正确的路由名称执行
reverse,针对获取所有notes的接口,应该用notes-list:
修改测试代码如下:
def test_get_all_notes_path(self): url = reverse('notes-list') response = self.client.get(url) self.assertEqual(response.status_code, 200)
- 若不确定生成的路由名称,可以在
urls.py中添加打印语句查看完整路由信息:
router = DefaultRouter() router.register("notes",views.NoteModelViewSet) # 打印所有生成的路由及其命名 print(router.urls)
运行项目时会输出所有路由详情,从中可以确认每个接口对应的正确命名。
内容的提问来源于stack exchange,提问作者Pankaj Singh Rana
相关产品推荐
相关产品推荐

