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