请求不是由视图的__init__ 设置的。确实是setup function设置的:
def setup(self, request, *args, **kwargs):
"""Initialize attributes shared by all view methods."""
self.request = request
self.args = args
self.kwargs = kwargs
此设置是在构造View 对象之后完成的。事实上,如果你使用.as_view(),它会返回一个基本上是view function的函数:
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.setup(request, *args, **kwargs)
if not hasattr(self, 'request'):
raise AttributeError(
"%s instance has no 'request' attribute. Did you override "
"setup() and forget to call super()?" % cls.__name__
)
return self.dispatch(request, *args, **kwargs)
因此它首先构造一个self(带有self = cls(**initkwargs)),然后调用self.setup(request, *args, **kwargs)来设置request对象以及args和kwargs。
如果您需要在设置request 之后做某事,那么您可以覆盖setup 方法。例如:
class SomeView(DetailView):
def setup(self, *args, **kwargs):
super().setup(*args, **kwargs)
print(dir)