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