基于 Django 类的视图 - request、args 和 kwargs 对象

Cha*_*des 3 django redundancy request args keyword-argument

在我看来,在 Django 的基于类的通用视图中,参数requestargskwargs传输,既作为视图实例属性,又作为方法参数。

我到底是什么意思?

Class django.views.generic.base.View,定义了以下函数,由其as_view方法调用:

def view(request, *args, **kwargs):
    self = cls(**initkwargs)
    if hasattr(self, 'get') and not hasattr(self, 'head'):
        self.head = self.get
    self.request = request
    self.args = args
    self.kwargs = kwargs
    return self.dispatch(request, *args, **kwargs)     
Run Code Online (Sandbox Code Playgroud)

该函数首先将requestargs和设置为视图实例属性,然后使用所有这些作为参数kwargs调用视图的方法。dispatch如果有的话,这样做的具体目的是什么?这不是多余的吗?

Kev*_*nry 5

尽管某些CBV 方法(例如dispatch())将参数直接传递给它们,但其他方法则不然。当然,您可能希望定义自己的方法来访问这些值,而不必传递它们。

CBV 的部分要点是您不必过多考虑控制流(在调用什么);相反,您可以只覆盖一小部分功能(例如get_context_data())。因此,更自然地考虑附加到对象的数据,而不是在方法之间传递的参数。

为什么不完全消除争论呢?可能是因为它更适合传统的基于函数的视图。例如,许多 FBV 都有一个等效的 CBV,它在get()方法中使用完全相同的代码。