diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 024f0eb8b..9740a0409 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -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): """