基于Django类的视图 - 请求,args和kwargs对象

时间:2014-01-27 14:12:18

标签: django request redundancy args kwargs

在我看来,在Django基于类的通用视图中,参数requestargskwargs从一个方法移动到另一个方法,既作为视图实例属性,又作为方法论证。

我的意思是什么?

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)     

此函数首先将requestargskwargs设置为视图实例属性,然后调用视图的dispatch方法,并将所有这些作为参数。究竟是什么目的,如果有的话?这不是多余的吗?

1 个答案:

答案 0 :(得分:3)

虽然某些 CBV方法(如dispatch())将参数直接传递给它们,但其他方法却没有。当然,您可能希望定义自己的方法,这些方法可以访问这些值而无需传递它们。

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

为什么不完全摆脱这些争论呢?可能是因为它与基于功能的视图的遗留问题更好地匹配。例如,许多FBV将具有使用get()方法中完全相同的代码的CBV等效项。