【问题标题】:How to reverse a url that is using DefaultRouter()?如何反转使用 DefaultRouter() 的 url?
【发布时间】:2019-09-26 17:52:16
【问题描述】:

我正在尝试在我的测试中使用 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')

【问题讨论】:

  • 你能提供你的PatientSet吗?看起来好像找到了,但需要 -list url 名称的参数。
  • 问题已更新。
  • 您似乎忘记将 URL 配置添加到 urlpatterns 列表中。应该是urlpatterns = [ url(r'^', include(router.urls)), ]@Zoro-Zen
  • 我没有在问题中正确添加它,但我在我的 urlpatterns 列表中有它。再次更新问题。

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


【解决方案1】:

首先,路由器的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/&lt;uuid&gt;/、视图路径 accounts.views.UserViewSet 和路径 account:user-detail名称(这是您想要的反向名称)。有了这个,我希望您能够为您的路线找到正确的名称。 URL 部分还指示该路由所需的任何参数。

【讨论】:

  • 成功了。我使用了命令python manage.py show_urls,正确的反向url是admin:patient_add
  • 很高兴它有帮助,该软件包中有一些有用的命令。
猜你喜欢
  • 2019-05-31
  • 2023-03-30
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2012-02-09
相关资源
最近更新 更多