如何反转使用 DefaultRouter() 的 url?

Ron*_*ipe 9 django url django-urls django-views django-rest-framework

我试图在我的测试中使用 reverse() 。我试过 这个答案!但它不起作用。
我仍然收到错误
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)),
]
Run Code Online (Sandbox Code Playgroud)

这里是 ModelViewSet

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

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

A. *_*arr 9

首先,base_name路由器的basenamekwarg 在 DRF 3.11 中被弃用,取而代之的是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
Run Code Online (Sandbox Code Playgroud)

每一行都包含 url /api/accounts/users/<uuid>/、视图的 pathaccounts.views.UserViewSet和route的名称(这是你想要的反向)account:user-detail。有了这个,我希望您能够为您的路线找到正确的名称。URL 部分还指示该路由所需的任何参数。

  • 很高兴它有所帮助,该软件包中有一些有用的命令。 (2认同)