web-dev-qa-db-fra.com

comment inverser l'URL d'une action personnalisée ViewSet dans Django rest framework

J'ai défini une action personnalisée pour un ViewSet

from rest_framework import viewsets

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

Et l'ensemble de vues est enregistré pour url de la manière conventionnelle

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

L'URL /api/users/gender/ travaux. Mais je ne sais pas comment l'obtenir en utilisant reverse dans le test unitaire. (Je peux sûrement coder en dur cette URL, mais ce sera bien de l'obtenir à partir du code)

Selon la documentation Django , le code suivant devrait fonctionner

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

Mais j'ai essayé ce qui suit et ils ne fonctionnent pas

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

Dans la documentation Django-restframework , il y a une fonction appelée reverse_action. Cependant, mes tentatives n'ont pas fonctionné

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

Quelle est la bonne façon d'inverser l'URL de cette action?

12
nos

Vous pouvez utiliser reverse simplement ajouter à l'action de nom de base de l'ensemble de vues:

reverse('myuser-gender') 

Voir partie connexe des documents.

8
neverwalkaloner