在我的网址中,我想传递像这样的其他参数
MyListView.as_view(extra="test")
但是当我这样做时,我得到错误,我只能传递那些在类中定义的属性。
我试过这个
class MyListView(APIView):
def as_view(self, extra=None, **kwargs):
self.extra=kwargs.pop('extra', None)
super(MyListView, self).as_view(**kwargs)
然后我得到
unbound method as_view() must be called with MyListView instance as first argument (got nothing instead)
答案 0 :(得分:4)
每次需要视图实例时(例如,处理请求时),MyListView.as_view()
调用的关键字参数都会传递给__init__
方法;您可以覆盖该方法以捕获extra
关键字:
class MyListView(APIView):
def __init__(self, extra=None, **kwargs):
self.extra = extra
super(MyListView, self).__init__(**kwargs)
as_view()
method必须是一种类方法;它不会在视图的实例上调用:
class MyListView(APIView):
@classmethod
def as_view(cls, extra=None, **kwargs):
cls.extra = extra
return super(MyListView, cls).as_view(**kwargs)
extra
关键字参数已明确命名,因此永远不会在kwargs
catch-all中找到它。您还希望返回 super()
来电的结果。
请注意,extra
属性也会在视图的所有实例之间共享!您也可以直接在视图类上设置它:
class MyListView(APIView):
extra = 'test'
由于as_view()
必须生成一个实例,因此您可以在传递super()
之前在class MyListView(APIView):
@classmethod
def as_view(cls, extra=None, **kwargs):
view = super(MyListView, cls).as_view(**kwargs)
view.extra = extra
return view
调用的返回值上添加该属性:
__init__
但是覆盖sh catalina.sh jpda start
正在实现相同的结果,并且更容易遵循未来的维护者。