Skip to content

Commit ae84438

Browse files
committed
Added DefaultRouter support (and test) for viewsets without the default action implemented, which is usually the list action.
1 parent 2937285 commit ae84438

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

rest_framework/routers.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from collections import namedtuple
2020
from django.conf.urls import patterns, url
2121
from django.core.exceptions import ImproperlyConfigured
22+
from django.core.urlresolvers import NoReverseMatch
2223
from rest_framework import views
2324
from rest_framework.response import Response
2425
from rest_framework.reverse import reverse
@@ -287,7 +288,15 @@ class APIRoot(views.APIView):
287288
def get(self, request, *args, **kwargs):
288289
ret = {}
289290
for key, url_name in api_root_dict.items():
290-
ret[key] = reverse(url_name, request=request, format=kwargs.get('format', None))
291+
try:
292+
ret[key] = reverse(
293+
url_name,
294+
request=request,
295+
format=kwargs.get('format', None)
296+
)
297+
except NoReverseMatch:
298+
continue
299+
291300
return Response(ret)
292301

293302
return APIRoot.as_view()

tests/test_routers.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from django.db import models
44
from django.test import TestCase
55
from django.core.exceptions import ImproperlyConfigured
6-
from rest_framework import serializers, viewsets, permissions
6+
from rest_framework import serializers, viewsets, mixins, permissions
77
from rest_framework.decorators import detail_route, list_route
88
from rest_framework.response import Response
99
from rest_framework.routers import SimpleRouter, DefaultRouter
@@ -284,3 +284,19 @@ def test_list_and_detail_route_decorators(self):
284284
else:
285285
method_map = 'get'
286286
self.assertEqual(route.mapping[method_map], endpoint)
287+
288+
289+
class TestRootWithAListlessViewset(TestCase):
290+
def setUp(self):
291+
class NoteViewSet(mixins.RetrieveModelMixin,
292+
viewsets.GenericViewSet):
293+
model = RouterTestModel
294+
295+
self.router = DefaultRouter()
296+
self.router.register(r'notes', NoteViewSet)
297+
self.view = self.router.urls[0].callback
298+
299+
def test_api_root(self):
300+
request = factory.get('/')
301+
response = self.view(request)
302+
self.assertEqual(response.data, {})

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy