Collect serialziers to try when rendering the Browsable API

The first one should work, if it doesn't because of Issue #2918, then
the second one should work. If no collected serializer worked, raise
the exception generated by the last one.
This commit is contained in:
Alejandro R. Sedeño 2016-02-23 13:01:46 -05:00
parent 342a940708
commit 8ee63e90b8

View File

@ -473,32 +473,40 @@ class BrowsableAPIRenderer(BaseRenderer):
): ):
return return
serializers = []
if existing_serializer is not None: if existing_serializer is not None:
serializer = existing_serializer serializers.append(existing_serializer)
else:
if has_serializer: if has_serializer:
if method in ('PUT', 'PATCH'): 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)
else: else:
# at this point we must have a serializer_class serializers.append(view.get_serializer(**kwargs))
if method in ('PUT', 'PATCH'): else:
serializer = self._get_serializer(view.serializer_class, view, # at this point we must have a serializer_class
request, instance=instance, **kwargs) if method in ('PUT', 'PATCH'):
else: serializers.append(self._get_serializer(view.serializer_class, view,
serializer = self._get_serializer(view.serializer_class, view, request, instance=instance, **kwargs))
request, **kwargs) else:
serializers.append(self._get_serializer(view.serializer_class, view,
request, **kwargs))
if hasattr(serializer, 'initial_data'): for serializer in serializers:
serializer.is_valid() try:
if hasattr(serializer, 'initial_data'):
serializer.is_valid()
form_renderer = self.form_renderer_class() form_renderer = self.form_renderer_class()
return form_renderer.render( return form_renderer.render(
serializer.data, serializer.data,
self.accepted_media_type, self.accepted_media_type,
{'style': {'template_pack': 'rest_framework/horizontal'}} {'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): def get_raw_data_form(self, data, view, method, request):
""" """