diff options
Diffstat (limited to 'rest_framework/renderers.py')
| -rw-r--r-- | rest_framework/renderers.py | 42 | 
1 files changed, 33 insertions, 9 deletions
| diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 1917a080..8361cd40 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -336,7 +336,7 @@ class BrowsableAPIRenderer(BaseRenderer):              return  # Cannot use form overloading          try: -            view.check_permissions(clone_request(request, method)) +            view.check_permissions(request)          except exceptions.APIException:              return False  # Doesn't have permissions          return True @@ -372,6 +372,30 @@ class BrowsableAPIRenderer(BaseRenderer):          return fields +    def _get_form(self, view, method, request): +        # We need to impersonate a request with the correct method, +        # so that eg. any dynamic get_serializer_class methods return the +        # correct form for each method. +        restore = view.request +        request = clone_request(request, method) +        view.request = request +        try: +            return self.get_form(view, method, request) +        finally: +            view.request = restore + +    def _get_raw_data_form(self, view, method, request, media_types): +        # We need to impersonate a request with the correct method, +        # so that eg. any dynamic get_serializer_class methods return the +        # correct form for each method. +        restore = view.request +        request = clone_request(request, method) +        view.request = request +        try: +            return self.get_raw_data_form(view, method, request, media_types) +        finally: +            view.request = restore +      def get_form(self, view, method, request):          """          Get a form, possibly bound to either the input or output data. @@ -465,15 +489,15 @@ class BrowsableAPIRenderer(BaseRenderer):          renderer = self.get_default_renderer(view)          content = self.get_content(renderer, data, accepted_media_type, renderer_context) -        put_form = self.get_form(view, 'PUT', request) -        post_form = self.get_form(view, 'POST', request) -        patch_form = self.get_form(view, 'PATCH', request) -        delete_form = self.get_form(view, 'DELETE', request) -        options_form = self.get_form(view, 'OPTIONS', request) +        put_form = self._get_form(view, 'PUT', request) +        post_form = self._get_form(view, 'POST', request) +        patch_form = self._get_form(view, 'PATCH', request) +        delete_form = self._get_form(view, 'DELETE', request) +        options_form = self._get_form(view, 'OPTIONS', request) -        raw_data_put_form = self.get_raw_data_form(view, 'PUT', request, media_types) -        raw_data_post_form = self.get_raw_data_form(view, 'POST', request, media_types) -        raw_data_patch_form = self.get_raw_data_form(view, 'PATCH', request, media_types) +        raw_data_put_form = self._get_raw_data_form(view, 'PUT', request, media_types) +        raw_data_post_form = self._get_raw_data_form(view, 'POST', request, media_types) +        raw_data_patch_form = self._get_raw_data_form(view, 'PATCH', request, media_types)          raw_data_put_or_patch_form = raw_data_put_form or raw_data_patch_form          name = self.get_name(view) | 
