在我看来,在Django基于类的通用视图中,参数request
,args
和kwargs
从一个方法移动到另一个方法,既作为视图实例属性,又作为方法论证。
我的意思是什么?
类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)
此函数首先将request
,args
和kwargs
设置为视图实例属性,然后调用视图的dispatch
方法,并将所有这些作为参数。究竟是什么目的,如果有的话?这不是多余的吗?
答案 0 :(得分:3)
虽然某些 CBV方法(如dispatch()
)将参数直接传递给它们,但其他方法却没有。当然,您可能希望定义自己的方法,这些方法可以访问这些值而无需传递它们。
CBV的部分要点是你不必考虑控制流程(谁正在调用什么);相反,你可以覆盖一小部分功能(例如get_context_data()
)。因此,考虑附加到对象的数据而不是从方法传递给方法的参数更为自然。
为什么不完全摆脱这些争论呢?可能是因为它与基于功能的视图的遗留问题更好地匹配。例如,许多FBV将具有使用get()
方法中完全相同的代码的CBV等效项。