为什么__init __()和get_context_data()中对象的属性不同?

问题描述 投票:1回答:1
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()。

为什么会有这种区别?

django python-3.x view
1个回答
2
投票

请求由视图的__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
© www.soinside.com 2019 - 2024. All rights reserved.