2014-12-15 7 views
12

mam urls.py, który wygląda tak:Jak wywołać adres URL struktury Django z wykorzystaniem przestrzeni nazw?

router = SimpleRouter() 
router.register(r'meetings', MeetingViewSet, 'meetings-list') 

urlpatterns = patterns('clubs.views', 
    url(r'^(?P<pk>\d+)/', include(router.urls)), 
    url(r'^amazon/$', AmazonView.as_view(), name="amazon"),) 

Chcę odwołać url 'meetings-list' korzystając reverse, jak w:

url = reverse('meetings-list')

ale gdy próbuję to mam NoReverseMatch: Reverse for 'MeetingViewSet' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried: []

Czy można to zrobić za pomocą Django Rest Framework?

Odpowiedz

19

Przy rejestracji widoki z routerem, możesz podać base_name jako trzeci argument. Ta nazwa bazowa jest używana do generowania indywidualnych nazw adresów URL, które są generowane jako [base_name]-list i [base_name]-detail.

W twoim przypadku, jesteś zarejestrowaniu viewset jak

router.register(r'meetings', MeetingViewSet, 'meetings-list') 

Więc base_name jest meetings-list, a nazwy View są meetings-list-list i meetings-list-detail. Wygląda na to, że szukasz meetings-list i meetings-detail, które wymagałyby base_name z meetings.

router.register(r'meetings', MeetingViewSet, 'meetings') 

Używasz również teraz-przestarzałe patterns składnię do definiowania adresów URL, ale nie są w rzeczywistości za pomocą odpowiednich url połączenia, które z nim pracować. Polecam po prostu zastąpienie patterns i zawijanie listy adresów URL za pomocą standardowej listy/krotki Pythona ([] lub ()).

To powinno rozwiązać problem, a rozmowa z numerem reverse powinna rozwiązać problem.

3

myślę, że wygląda o wiele lepsze i czystsze dla Ciebie:

router_urls = patterns(
    '', 
    url(r'^meetings/$', MeetingViewSet.as_view(), 'meetings-list'), 
) 

urlpatterns = patterns(
    '', 
    url(r'^(?P<pk>\d+)/', include(router_urls, namespace='router')), 
) 

Następnie wil zrobić reverse('router:meetings-list', args=(pk,))

Przypuszczałem, że MeetingViewSet jest CBV

+1

Po prostu heads up, Django REST Framework nie jest zgodny ze standardowymi CBV, a to spowoduje błąd, ponieważ musisz przekazać słownik do '.as_view' –