pdeuchler
pdeuchler

Reputation: 148

DRF Browsable API only shows one Router

Essentially, depending on the order in which I add my routes to my urlpatterns the browsable API will only show one router at a time. Here's my code:

urls.py:

from django.conf.urls import url, include
from rest_framework import routers

from .views import PlantViewSet

# url router
router = routers.DefaultRouter()
router.register(r'plants', PlantViewSet, base_name='Plants')

djoser_urls = [url(r'^', include('djoser.urls')), ]

urlpatterns = [
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^docs/', include('rest_framework_swagger.urls')),
    # url(r'^', include(router.urls)),
    # url(r'^', include('djoser.urls')),
] + djoser_urls + router.urls

This only displays the djoser urls:

djoser_only

However simply reversing the order in which I add the urls:

urls.py:

from django.conf.urls import url, include
from rest_framework import routers

from .views import PlantViewSet

# url router
router = routers.DefaultRouter()
router.register(r'plants', PlantViewSet, base_name='Plants')

djoser_urls = [url(r'^', include('djoser.urls')), ]

urlpatterns = [
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^docs/', include('rest_framework_swagger.urls')),
    # url(r'^', include(router.urls)),
    # url(r'^', include('djoser.urls')),
] + router.urls + djoser_urls

This only displays the router urls!

router_only

The same thing happens when I just use the include() lines I've commented out, whichever comes first in the list is the only router that gets displayed. Furthermore, no matter which router gets picked up the api-auth/ and docs/ urls are never shown. Is there anyway to get a unified api root without having to create my own custom view?

Upvotes: 3

Views: 2164

Answers (1)

Kevin Brown-Silva
Kevin Brown-Silva

Reputation: 41671

This doesn't have anything to do with Django REST framework, it happens because of how Django deals with duplicate urls.

You are trying to have a single url be handled by two different views: The DRF router index and the djoser root view. Django will only display the first view matching the search pattern that it finds, which is generally the first urls that are included in the url patterns.

Django REST framework will also not detect multiple routers that are available and group them together on the same page, which is sounds like you are hoping to see. Even if it could, djoser doesn't use a router so there is no way that DRF could actually know to include it.

Is there anyway to get a unified api root without having to create my own custom view?

So to answer the main question: No it is not possible for Django REST framework to automatically group these views together. You are going to need to create your own customer view to handle this.

Upvotes: 3

Related Questions