2015-10-06 5 views
0

У меня есть эта база URLS файл:Джанго-Rest-Framework: маршрутизатор не работает

url(r'^locations/', include('locations.urls')), 

в locations.urls.py приложение я следующие ссылки URL:

url(r'^/?$', LocationList.as_view()), 
url(r'^(?P<pk>[a-zA-Z0-9\-\$]+)/?$', LocationDetail.as_view()), 
url(r'services/?$', LocationServiceseList.as_view()), 
url(r'services/(?P<service_id>[a-zA-Z0-9\-\$]+)/?$', LocationServicesDetail.as_view()), 

Для выше URL-адрес referce я хочу пользователю routers Django-Rest-framework

для locations/services/ Я создал GenericViewSet из DRF, и я попытался маршрутизатор успешно внесены следующие изменения в places.urls:

router = routers.SimpleRouter() 
router.register(r'services', LocationServiceSet) 

url(r'^/?$', LocationList.as_view()), 
url(r'^(?P<vehicle_id>[a-zA-Z0-9\-\$]+)/?$', LocationDetail.as_view()), 
url(r'^', include(router.urls)), 

Теперь я хочу, чтобы создать маршрутизатор для /locations/ endpoinsts и внесены следующие изменения

router = routers.SimpleRouter() 
router.register(r'services', LocationServiceSet) 
router.register(r'', LocationSet) 


url(r'^', include(router.urls)), 

Получение 404 для /locations/ с StackTrace показывает хотя /locations/services/ работают отлично:

^locations/^^services/$ [name='locationsservice-list'] 
^locations/^^services/(?P<pk>[^/.]+)/$ [name='locationsservice-detail'] 
^locations/^^/$ [name='locations-list'] 
^locations/^^/(?P<pk>[^/.]+)/$ [name='locations-detail'] 

ответ

0

Это происходит из-за пустой строки prefix аргумент - router.register() функция для LocationSet.

Когда вы использовали пустую строку '' как prefix для регистрации маршрутизатора, она сгенерировала следующие URL-адреса. (Обратите внимание на двойной слэш в адресах)

locations//$ # double slash in urls 
locations//(?P<pk>[^/.]+)/$ # double slash in urls 

Чтобы решить эту проблему, необходимо определить и зарегистрировать этот маршрутизатор в базовых адресов файл вместо locations/urls.py со значением префикса как locations.

# base urls.py 
router = routers.SimpleRouter() 
router.register(r'locations', LocationSet) 

... 
url(r'^locations/', include('locations.urls')), # include app urls 
url(r'^', include(router.urls)), # include router urls 

Другим решением является использовать не пустую строку в качестве prefix при регистрации маршрутизатора для LocationSet в locations/urls.py.

Смежные вопросы