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() 会打印。
为什么会有这样的差异?
最佳答案
该请求不是由 View 的__init__
设置的。事实上,它是由 setup
function 设置的。 :
def setup(self, request, *args, **kwargs): """Initialize attributes shared by all view methods.""" <b>self.request = request</b> 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 <b>self.setup(request, *args, **kwargs)</b> 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 <b>setup</b>(self, *args, **kwargs):
super().setup(*args, **kwargs)
print(dir)
关于django - 为什么 __init__() 和 get_context_data() 中对象的属性不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60640328/