我已经为 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 许可协议
您可以使用
reverse
只需添加到视图集的基本名称操作:请参阅文档的 相关部分。