【问题标题】:Why the attributes of a object in __init__() and get_context_data() different?为什么 __init__() 和 get_context_data() 中对象的属性不同?
【发布时间】:2020-06-23 16:34:41
【问题描述】:
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】:

    请求不是由视图的__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)

    【讨论】:

    • 如何覆盖 setup() 方法? setup() 中的最后一行 print(dir) 没有执行?什么时候执行?
    • 如何让 init() 方法执行两次? [链接]stackoverflow.com/questions/60650878/…
    • @MounikaBathina:setup 方法仅在 Django-2.2 之后定义。在此之前,request等都是在view函数本身设置的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2018-04-30
    相关资源
    最近更新 更多