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

标签 django python-3.x view

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 对象与 argskwargs 一起设置。

如果您需要在设置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/

相关文章:

django - 在开发环境中本地提供 django 媒体文件

除非经过检查,否则带有 BooleanField 的 Django 表单总是无效的

python - 如何从最里面的一对开始反转每对匹配括号中包含的字符串? CodeFights

javascript - 从 Javascript 确定 Django 用户 ID

python - 导入模块并使用其方法

android - 以编程方式生成 View 并捕获位图

python - 为什么我的 send_mail() 命令在 Django 中不起作用?

python - 使用 PyMongo,通过 "_id"查询不会在 Python 的 MongoDB 中返回文件

.net - 使用 .NET ListView 高效搜索数十万条记录

ios - UIView 中的背景颜色未显示