如何反向使用DefaultRouter()的URL?

时间:2019-05-08 23:11:13

标签: django url django-rest-framework django-views django-urls

我正在尝试在测试中使用reverse()。我尝试了this answer!但不起作用。
我仍然遇到错误
 django.urls.exceptions.NoReverseMatch: Reverse for 'patients-list' with no arguments not found

router = DefaultRouter()
router.register(r'patients', views.PatientSet, base_name='patients')

urlpatterns = [
    url(r'^', include(router.urls)),
]

这里是ModelViewSet

class PatientSet(viewsets.ModelViewSet):
    queryset = Patient.objects.all()
    serializer_class = PatientSerializer
    permission_classes = [IsDoctorUser]
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ['is_active']

我在测试url = reverse('patients-list')中使用这种方式

1 个答案:

答案 0 :(得分:2)

首先,不推荐使用base_name路由器的kwarg,而推荐使用DRF 3.11中的basename kwarg,但这不是造成问题的原因。使用您提供的代码示例,我实际上也看不到任何问题。

我建议尝试安装django-extensions软件包。安装并配置django-extensions后,可以使用python manage.py show_urls命令输出所有路由的列表。

  

python manage.py show_urls

/api/accounts/users/ accounts.views.UserViewSet account:user-list
/api/accounts/users/<uuid>/ accounts.views.UserViewSet account:user-detail

每行包含URL /api/accounts/users/<uuid>/,视图的路径accounts.views.UserViewSet和路由account:user-detail名称(这是您想要的反向名称) 。希望以此为您的路线找到正确的名称。 URL部分还指示该路由所需的任何参数。