如何在 django restframework 中反转 ViewSet 的自定义操作的 URL

新手上路,请多包涵

我已经为 ViewSet 定义了自定义操作

from rest_framework import viewsets

class UserViewSet(viewsets.ModelViewSet):
    @action(methods=['get'], detail=False, permission_classes=[permissions.AllowAny])
    def gender(self, request):
        ....

并且视图集以常规方式注册到url

 from django.conf.urls import url, include

from rest_framework import routers
from api import views

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet, base_name='myuser')

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

URL /api/users/gender/ 有效。但我不知道如何在单元测试中使用 reverse 获取它。 (我当然可以对这个 URL 进行硬编码,但是从代码中获取它会很好)

根据 django文档,下面的代码应该可以工作

reverse('admin:app_list', kwargs={'app_label': 'auth'})
# '/admin/auth/'

但我尝试了以下但它们不起作用

reverse('myuser-list', kwargs={'app_label':'gender'})
# errors out
reverse('myuser-list', args=('gender',))
# '/api/users.gender'

django-restframework 文档 中,有一个名为 reverse_action 的函数。但是,我的尝试没有奏效

from api.views import UserViewSet
a = UserViewSet()
a.reverse_action('gender') # error out
from django.http import HttpRequest
req = HttpRequest()
req.method = 'GET'
a.reverse_action('gender', request=req)  # still error out

反转该操作的 URL 的正确方法是什么?

原文由 nos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 555
2 个回答

您可以使用 reverse 只需添加到视图集的基本名称操作:

 reverse('myuser-gender')

请参阅文档的 相关部分

原文由 neverwalkaloner 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以打印给定的所有可逆 url 名称 router 在启动时使用 get_urls() 方法

在urls.py中最后一项注册到 router = DefaultRouter() 变量后,可以添加:

 #router = routers.DefaultRouter()
#router.register(r'users', UserViewSet)
#...
import pprint
pprint.pprint(router.get_urls())

下次初始化您的应用程序时,它将打印到标准输出,例如

[<RegexURLPattern user-list ^users/$>,
 <RegexURLPattern user-list ^users\.(?P<format>[a-z0-9]+)/?$>,
 <RegexURLPattern user-detail ^users/(?P<pk>[^/.]+)/$>,
 <RegexURLPattern user-detail ^users/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$>,
#...
]

其中 ‘user-list’ 和 ‘user-detail’ 是可以给 reverse(...) 的名称

原文由 Anshik 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题