class SomeView(DetailView) :
def __init__(self, *kwargs):
print(type(self), dir(self))
def get_context_data:
print(type(self), dir(self))
__ init__不会为dir(self)打印“请求属性”,但会打印get_context_data()。
为什么会有这种区别?
请求由视图的__init__
设置not。实际上,它是由setup
function设置的:
setup
完成此设置之后构造了 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
因此,它首先构造一个view
(带有 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