This commit is contained in:
Alejandro R. Sedeño 2016-06-08 15:03:55 +00:00
commit 70d7fabc54
2 changed files with 67 additions and 22 deletions

View File

@ -471,23 +471,26 @@ class BrowsableAPIRenderer(BaseRenderer):
):
return
serializers = []
if existing_serializer is not None:
serializer = existing_serializer
else:
serializers.append(existing_serializer)
if has_serializer:
if method in ('PUT', 'PATCH'):
serializer = view.get_serializer(instance=instance, **kwargs)
serializers.append(view.get_serializer(instance=instance, **kwargs))
else:
serializer = view.get_serializer(**kwargs)
serializers.append(view.get_serializer(**kwargs))
else:
# at this point we must have a serializer_class
if method in ('PUT', 'PATCH'):
serializer = self._get_serializer(view.serializer_class, view,
request, instance=instance, **kwargs)
serializers.append(self._get_serializer(view.serializer_class, view,
request, instance=instance, **kwargs))
else:
serializer = self._get_serializer(view.serializer_class, view,
request, **kwargs)
serializers.append(self._get_serializer(view.serializer_class, view,
request, **kwargs))
for serializer in serializers:
try:
if hasattr(serializer, 'initial_data'):
serializer.is_valid()
@ -497,6 +500,11 @@ class BrowsableAPIRenderer(BaseRenderer):
self.accepted_media_type,
{'style': {'template_pack': 'rest_framework/horizontal'}}
)
except TypeError:
pass
# If none of the rendering attempts succeeded, raise the TypeError generated by the last
# attempt.
raise
def get_raw_data_form(self, data, view, method, request):
"""

View File

@ -66,6 +66,16 @@ class FKInstanceView(generics.RetrieveUpdateDestroyAPIView):
serializer_class = ForeignKeySerializer
class ManyPostView(generics.GenericAPIView):
queryset = BasicModel.objects.all()
serializer_class = BasicSerializer
renderer_classes = (renderers.BrowsableAPIRenderer, renderers.JSONRenderer)
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(self.get_queryset(), many=True)
return Response(serializer.data, status.HTTP_200_OK)
class SlugBasedInstanceView(InstanceView):
"""
A model with a slug-field.
@ -546,3 +556,30 @@ class TestGuardedQueryset(TestCase):
request = factory.get('/')
with pytest.raises(RuntimeError):
view(request).render()
class TestManyPostView(TestCase):
def setUp(self):
"""
Create 3 BasicModel instances.
"""
items = ['foo', 'bar', 'baz']
for item in items:
BasicModel(text=item).save()
self.objects = BasicModel.objects
self.data = [
{'id': obj.id, 'text': obj.text}
for obj in self.objects.all()
]
self.view = ManyPostView.as_view()
def test_post_many_post_view(self):
"""
POST request to ManyPostView should return a list of objects.
"""
data = {}
request = factory.post('/', data, format='json')
with self.assertNumQueries(1):
response = self.view(request).render()
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 3)