如何在 Django REST 框架中的 as_view 中传递额外的参数
How can I pass additional args in as_view in Django REST framework
在我的网址中,我想像这样传递额外的参数
MyListView.as_view(extra="test")
但是,当我这样做时,出现错误,提示我只能传递在 class.
中定义的那些属性
我试过了
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)
每次需要视图实例时(例如处理请求时),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方法;它不是在视图的实例上调用的:
class MyListView(APIView):
@classmethod
def as_view(cls, extra=None, **kwargs):
cls.extra = extra
return super(MyListView, cls).as_view(**kwargs)
extra
关键字参数已明确命名,因此它永远不会在 kwargs
包罗万象中找到。您还想 return super()
调用的结果。
请注意,extra
属性也会在视图的所有实例之间共享!你也可以直接在view上设置class:
class MyListView(APIView):
extra = 'test'
由于 as_view()
必须生成一个实例,您可以在 super()
调用的 return 值上添加属性,然后再将其传递给它:
class MyListView(APIView):
@classmethod
def as_view(cls, extra=None, **kwargs):
view = super(MyListView, cls).as_view(**kwargs)
view.extra = extra
return view
但随后覆盖 __init__
会获得相同的结果,并且未来的维护者更容易遵循。
在我的网址中,我想像这样传递额外的参数
MyListView.as_view(extra="test")
但是,当我这样做时,出现错误,提示我只能传递在 class.
中定义的那些属性我试过了
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)
每次需要视图实例时(例如处理请求时),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方法;它不是在视图的实例上调用的:
class MyListView(APIView):
@classmethod
def as_view(cls, extra=None, **kwargs):
cls.extra = extra
return super(MyListView, cls).as_view(**kwargs)
extra
关键字参数已明确命名,因此它永远不会在 kwargs
包罗万象中找到。您还想 return super()
调用的结果。
请注意,extra
属性也会在视图的所有实例之间共享!你也可以直接在view上设置class:
class MyListView(APIView):
extra = 'test'
由于 as_view()
必须生成一个实例,您可以在 super()
调用的 return 值上添加属性,然后再将其传递给它:
class MyListView(APIView):
@classmethod
def as_view(cls, extra=None, **kwargs):
view = super(MyListView, cls).as_view(**kwargs)
view.extra = extra
return view
但随后覆盖 __init__
会获得相同的结果,并且未来的维护者更容易遵循。