2015-08-09 11 views
13

Mam pewien problem. Używam routerów w Django Rest Framework i chcę przetestować niektóre metody API.uzyskać nazwę URL routera podczas testowania w Django Rest Framework

W urls.py:

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

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

] 

Więc w tests.py chcę użyć coś jak odwrotnej. Teraz używam

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

jego zakodowanego ciąg, jeśli mogę użyć:

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

mam błąd:

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

Jak to naprawić?

Dzięki!

Odpowiedz

23

DRF dodaje przyrostki w widokach dla różnych adresów URL - lista, szczegóły i ewentualnie niestandardowe adresy URL. Możesz to zobaczyć w source code oraz w docs. Więc w twoim przypadku rzeczywista odwrotna powinno być coś takiego:

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>/ 

dlatego jego również prawdopodobnie lepiej używać nazwy zasobu jako router base_name. Na przykład base_name='user' vs base_name='users_list'.