From 0e5d26fa6a261e5437489cb4010bcd25d6632443 Mon Sep 17 00:00:00 2001 From: Venelin Stoykov Date: Thu, 22 Jun 2017 16:22:17 +0300 Subject: [PATCH] Fixed #5228 Set ViewSet args/kwargs/request before dispatch --- rest_framework/viewsets.py | 4 ++++ tests/test_viewsets.py | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/rest_framework/viewsets.py b/rest_framework/viewsets.py index 70fe72f84..7f3c550a9 100644 --- a/rest_framework/viewsets.py +++ b/rest_framework/viewsets.py @@ -82,6 +82,10 @@ class ViewSetMixin(object): if hasattr(self, 'get') and not hasattr(self, 'head'): self.head = self.get + self.request = request + self.args = args + self.kwargs = kwargs + # And continue as usual return self.dispatch(request, *args, **kwargs) diff --git a/tests/test_viewsets.py b/tests/test_viewsets.py index 78ad24dea..846a36807 100644 --- a/tests/test_viewsets.py +++ b/tests/test_viewsets.py @@ -13,6 +13,15 @@ class BasicViewSet(GenericViewSet): return Response({'ACTION': 'LIST'}) +class InstanceViewSet(GenericViewSet): + + def dispatch(self, request, *args, **kwargs): + return self.dummy(request, *args, **kwargs) + + def dummy(self, request, *args, **kwargs): + return Response({'view': self}) + + class InitializeViewSetsTestCase(TestCase): def test_initialize_view_set_with_actions(self): request = factory.get('/', '', content_type='application/json') @@ -42,3 +51,17 @@ class InitializeViewSetsTestCase(TestCase): "For example `.as_view({'get': 'list'})`") else: self.fail("actions must not be empty.") + + def test_args_kwargs_request_action_map_on_self(self): + """ + Test a view only has args, kwargs, request, action_map + once `as_view` has been called. + """ + bare_view = InstanceViewSet() + view = InstanceViewSet.as_view(actions={ + 'get': 'dummy', + })(factory.get('/')).data['view'] + + for attribute in ('args', 'kwargs', 'request', 'action_map'): + self.assertNotIn(attribute, dir(bare_view)) + self.assertIn(attribute, dir(view))