gpt4 book ai didi

python - 如何在 Django REST 框架中的 as_view 中传递额外的参数

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:30 27 4
gpt4 key购买 nike

在我的网址中,我想像这样传递额外的参数

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)

最佳答案

每次需要 View 实例时(例如处理请求时),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必须是类方法;它不是在 View 的实例上调用的:

class MyListView(APIView):
@classmethod
def as_view(cls, extra=None, **kwargs):
cls.extra = extra
return super(MyListView, cls).as_view(**kwargs)

extra 关键字参数被明确命名,因此它永远不会在 kwargs 包罗万象中找到。您还想返回 super() 调用的结果。

请注意,extra 属性也会在 View 的所有实例之间共享!你也可以直接在 View 类上设置:

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__ 会获得相同的结果,并且更容易为 future 的维护者所遵循。

关于python - 如何在 Django REST 框架中的 as_view 中传递额外的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30011495/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com