代码之家  ›  专栏  ›  技术社区  ›  nos

如何在django restframework中反转视图集自定义操作的URL

  •  8
  • nos  · 技术社区  · 6 年前

    我为视图集定义了自定义操作

    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)),                                               
    ]   
    

    网址 /api/users/gender/ 作品。但我不知道怎么用 reverse 在单元测试中。(我当然可以硬编码这个URL,但从代码中获取它会很好)

    根据 django documentation ,以下代码应该有效

    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 documentation ,有一个函数调用 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的正确方法是什么?

    1 回复  |  直到 6 年前
        1
  •  4
  •   neverwalkaloner    6 年前

    你可以用 reverse 只需添加到视图集的basename操作:

    reverse('myuser-gender') 
    

    related part 文件数量。