2015-08-09 16 views
13

Ho qualche problema. Io uso i router in Django Rest Framework e voglio testare alcuni metodi API.ottiene il nome URL del router durante il test in Django Rest Framework

In urls.py:

router = DefaultRouter() 
router.register(r'my-list', MyViewSet, base_name="my_list") 

urlpatterns = [ 
    url(r'^api/', include(router.urls, 
          namespace='api'),), 

] 

Così, in tests.py voglio usare qualcosa come inverso. Ora uso

response = self.client.get('/api/my-list/') 

La sua una stringa codificata difficile, se uso:

response = self.client.get(reverse('api:my_list') 

ho un errore:

django.core.urlresolvers.NoReverseMatch: Reverse for 'my_list' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: [] 

Come risolvere questo?

Grazie!

risposta

23

DRF aggiunge suffissi in viewset per URL diversi: elenco, dettagli e possibilmente URL personalizzati. Lo puoi vedere in source code e in docs. Quindi nel tuo caso il contrario reale dovrebbe essere qualcosa di simile:

reverse('api:my_list-list') # for list URL. e.g. /api/my-list/ 
reverse('api:my_list-detail') # for detail URL. e.g. /api/my-list/<pk>/ 

Questo è il motivo per cui la sua anche probabilmente meglio utilizzare un nome di risorsa come router base_name. Ad esempio base_name='user' vs base_name='users_list'.

Problemi correlati