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,23 +473,26 @@ 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: else:
serializer = view.get_serializer(**kwargs) serializers.append(view.get_serializer(**kwargs))
else: else:
# at this point we must have a serializer_class # at this point we must have a serializer_class
if method in ('PUT', 'PATCH'): if method in ('PUT', 'PATCH'):
serializer = self._get_serializer(view.serializer_class, view, serializers.append(self._get_serializer(view.serializer_class, view,
request, instance=instance, **kwargs) request, instance=instance, **kwargs))
else: else:
serializer = self._get_serializer(view.serializer_class, view, serializers.append(self._get_serializer(view.serializer_class, view,
request, **kwargs) request, **kwargs))
for serializer in serializers:
try:
if hasattr(serializer, 'initial_data'): if hasattr(serializer, 'initial_data'):
serializer.is_valid() serializer.is_valid()
@ -499,6 +502,11 @@ class BrowsableAPIRenderer(BaseRenderer):
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):
""" """