为什么要使用get_context_data(self,** kwargs)和super()

时间:2018-08-01 11:02:22

标签: python django python-3.x

在基于类的视图中,我只是使用get_context_data作为函数,但是为什么

class CBV (TemplateView):

    def get_context_data(self,**kwargs):
        context = super ().get_context_data  (**kwargs)

1 个答案:

答案 0 :(得分:1)

就像documentation on get_context_data [Django-doc]所说:

  

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

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

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

一个典型的用例是:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['number'] = random.randrange(1, 100)
    return context

因此,此处的“子类”在上下文中添加了一个额外的元素number

因此,我们在此以方法解析顺序(MRO)调用下一个函数。这通常是类的父级,尽管在多重继承的情况下MRO的规则要复杂一些。原因是这些父母也可以将数据添加到上下文中。因此,通过调用父级的get_context_data,父级将返回一个可能已经包含一些数据的字典,然后子级可以依次向context添加更多数据(或对其进行更改) ),按相反的 MRO 顺序。但是,只有在每个子代执行一次super().get_context_data(**kwargs)调用并修补结果(从而不构造新字典)的情况下,这种情况才会发生。