如何在 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__ 会获得相同的结果,并且未来的维护者更容易遵循。