فهرست منبع

Fixed #19316 -- Set View args/kwargs/request before dispatch

George Hickman 12 سال پیش
والد
کامیت
ea6b95dbec
2فایلهای تغییر یافته به همراه14 افزوده شده و 3 حذف شده
  1. 3 3
      django/views/generic/base.py
  2. 11 0
      tests/regressiontests/generic_views/base.py

+ 3 - 3
django/views/generic/base.py

@@ -62,6 +62,9 @@ class View(object):
             self = cls(**initkwargs)
             if hasattr(self, 'get') and not hasattr(self, 'head'):
                 self.head = self.get
+            self.request = request
+            self.args = args
+            self.kwargs = kwargs
             return self.dispatch(request, *args, **kwargs)
 
         # take name and docstring from class
@@ -80,9 +83,6 @@ class View(object):
             handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
         else:
             handler = self.http_method_not_allowed
-        self.request = request
-        self.args = args
-        self.kwargs = kwargs
         return handler(request, *args, **kwargs)
 
     def http_method_not_allowed(self, request, *args, **kwargs):

+ 11 - 0
tests/regressiontests/generic_views/base.py

@@ -216,6 +216,17 @@ class ViewTest(unittest.TestCase):
         response_allows = set(response['Allow'].split(', '))
         self.assertEqual(set(expected_methods + ('OPTIONS',)), response_allows)
 
+    def test_args_kwargs_request_on_self(self):
+        """
+        Test a view only has args, kwargs & request once `as_view`
+        has been called.
+        """
+        bare_view = InstanceView()
+        view = InstanceView.as_view()(self.rf.get('/'))
+        for attribute in ('args', 'kwargs', 'request'):
+            self.assertNotIn(attribute, dir(bare_view))
+            self.assertIn(attribute, dir(view))
+
 
 class TemplateViewTest(TestCase):
     urls = 'regressiontests.generic_views.urls'