gpt4 book ai didi

django - 为什么 __init__() 和 get_context_data() 中对象的属性不同?

转载 作者:行者123 更新时间:2023-12-04 10:25:37 25 4
gpt4 key购买 nike

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__ 设置的的观点。确实,它是由 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对象连同 argskwargs .

如果您需要在 request 之后做些什么已设置,因此您可以覆盖 setup方法。例如:
class SomeView(DetailView):

def setup(self, *args, **kwargs):
super().setup(*args, **kwargs)
print(dir)

关于django - 为什么 __init__() 和 get_context_data() 中对象的属性不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60640328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com