Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么要使用get_context_数据(self、**kwargs)和super()_Python_Django_Python 3.x - Fatal编程技术网

Python 为什么要使用get_context_数据(self、**kwargs)和super()

Python 为什么要使用get_context_数据(self、**kwargs)和super(),python,django,python-3.x,Python,Django,Python 3.x,在基于类的视图中,我只是使用get\u context\u data作为函数,但为什么 class CBV (TemplateView): def get_context_data(self,**kwargs): context = super ().get_context_data (**kwargs) 就像上面说的: 返回表示模板上下文的字典。提供的关键字参数将构成返回的上下文。(……) 如果因此让函数返回字典{foo':42},则可以在模板中编写变量{{foo

在基于类的视图中,我只是使用
get\u context\u data
作为函数,但为什么

class CBV (TemplateView):

    def get_context_data(self,**kwargs):
        context = super ().get_context_data  (**kwargs)
就像上面说的:

返回表示模板上下文的字典。提供的关键字参数将构成返回的上下文。(……)

如果因此让函数返回字典
{foo':42}
,则可以在模板中编写变量
{{foo}}
,然后将其替换为
42

这通常用于将各种数据传递给模板:登录的用户、表单、查询集等。然后模板可以相应地呈现这些组件

典型的用例是:

def获取上下文数据(self,**kwargs):
context=super()。获取上下文数据(**kwargs)
上下文['number']=random.randrange(1100)
返回上下文
因此,这里的“子类”向上下文添加了一个额外的元素
number


因此,我们在这里调用方法解析顺序(MRO)中的下一个函数。这通常是一个类的父类,尽管在多重继承的情况下MRO的规则要复杂一些。原因是这些父级也可以向上下文添加数据。因此,通过调用父对象的
get\u context\u data
,父对象返回一个可能已经包含一些数据的字典,然后子对象(ren)可以依次向
context
(或更改它)添加更多数据,顺序与MRO相反。但是,只有当每个孩子都执行
super().获取上下文数据(**kwargs)
调用并修补结果(因此不会构建新词典)时才会发生这种情况。

你说的“但是为什么”是什么意思?首先,您应该
返回该上下文,如果您不想添加/更改任何内容,您可以简单地删除这个
获取上下文数据
函数。在这里,我不理解使用获取上下文数据函数的目的,以及为什么调用super()向模板添加额外元素。使用了
super()
调用,因为已经有很多子类修补了
get_context_data
(添加表单等),所以我们也要考虑到这一点。如果媒体静态需要get_context_datastatic,那么媒体静态不是基于类的视图,这是一个附加到
ContextMixin
的函数。感谢willem van Onsem,让我困惑的是,从get\u context\u数据中调用get\u context\u数据肯定会启动一个递归循环?@RossSymonds:这是
super()
get\u context\u data(),这是一个代理对象,它将遍历第一个祖先的MRO。
def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['number'] = random.randrange(1, 100)
    return context