diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 97b60a004..1dd666a3c 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -550,7 +550,7 @@ class HyperlinkedRelatedField(RelatedField): view_namespace = self.view_namespace or getattr(self.parent.opts, 'view_namespace', None) view_name = self.view_name if view_namespace: - view_name = '%(namespace)s:%(name)' % {'namespace': view_namespace, 'name':view_name} + view_name = '%(namespace)s:%(name)s' % {'namespace': view_namespace, 'name': view_name} request = self.context.get('request', None) format = self.format or self.context.get('format', None) @@ -662,7 +662,7 @@ class HyperlinkedIdentityField(Field): view_namespace = self.view_namespace or getattr(self.parent.opts, 'view_namespace', None) view_name = self.view_name if view_namespace: - view_name = '%(namespace)s:%(name)' % {'namespace': view_namespace, 'name':view_name} + view_name = '%(namespace)s:%(name)s' % {'namespace': view_namespace, 'name': view_name} kwargs = {self.pk_url_kwarg: obj.pk} try: diff --git a/rest_framework/generics.py b/rest_framework/generics.py index dd8dfcf8d..736af752b 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -41,7 +41,7 @@ class GenericAPIView(views.APIView): if serializer_class is None: class DefaultSerializer(self.model_serializer_class): - class Meta: + class Meta(self.model_serializer_class.Meta): model = self.model serializer_class = DefaultSerializer diff --git a/rest_framework/tests/hyperlinkedserializers.py b/rest_framework/tests/hyperlinkedserializers.py index d7effce70..b91628804 100644 --- a/rest_framework/tests/hyperlinkedserializers.py +++ b/rest_framework/tests/hyperlinkedserializers.py @@ -1,4 +1,4 @@ -from django.conf.urls.defaults import patterns, url +from django.conf.urls.defaults import patterns, url, include from django.test import TestCase from django.test.client import RequestFactory from rest_framework import generics, status, serializers @@ -49,6 +49,13 @@ class ManyToManyDetail(generics.RetrieveAPIView): model = ManyToManyModel model_serializer_class = serializers.HyperlinkedModelSerializer +class NamespacedManyToManySerializer(serializers.HyperlinkedModelSerializer): + class Meta: + view_namespace = 'namespacetests' + +class NamespacedManyToManyDetail(generics.RetrieveAPIView): + model = ManyToManyModel + model_serializer_class = NamespacedManyToManySerializer class BlogPostCommentListCreate(generics.ListCreateAPIView): model = BlogPostComment @@ -76,7 +83,13 @@ class OptionalRelationDetail(generics.RetrieveAPIView): model_serializer_class = serializers.HyperlinkedModelSerializer +anchor_urls = patterns('', + url(r'^(?P\d+)/$', AnchorDetail.as_view(), name='anchor-detail'), + url(r'^manytomany/(?P\d+)/$', NamespacedManyToManyDetail.as_view(), name='manytomanymodel-detail'), +) + urlpatterns = patterns('', + url(r'^other/namespace/', include(anchor_urls, namespace='namespacetests', app_name='namespacetests')), url(r'^basic/$', BasicList.as_view(), name='basicmodel-list'), url(r'^basic/(?P\d+)/$', BasicDetail.as_view(), name='basicmodel-detail'), url(r'^anchor/(?P\d+)/$', AnchorDetail.as_view(), name='anchor-detail'), @@ -156,6 +169,15 @@ class TestManyToManyHyperlinkedView(TestCase): }] self.list_view = ManyToManyList.as_view() self.detail_view = ManyToManyDetail.as_view() + self.namespaced_data = [{ + 'url': 'http://testserver/other/namespace/manytomany/1/', + 'rel': [ + 'http://testserver/other/namespace/1/', + 'http://testserver/other/namespace/2/', + 'http://testserver/other/namespace/3/', + ] + }] + self.namespaced_detail_view = NamespacedManyToManyDetail.as_view() def test_get_list_view(self): """ @@ -175,6 +197,15 @@ class TestManyToManyHyperlinkedView(TestCase): self.assertEquals(response.status_code, status.HTTP_200_OK) self.assertEquals(response.data, self.data[0]) + def test_get_detail_namespaced_view(self): + """ + GET requests to a View in a namespace should succeed. + """ + request = factory.get('/other/namespace/manytomany/1/') + response = self.namespaced_detail_view(request, pk=1).render() + self.assertEquals(response.status_code, status.HTTP_200_OK) + self.assertEquals(response.data, self.namespaced_data[0]) + class TestCreateWithForeignKeys(TestCase): urls = 'rest_framework.tests.hyperlinkedserializers'