如何在Django REST框架中传递as_view中的其他args

时间:2015-05-03 07:52:58

标签: python django django-rest-framework

在我的网址中,我想传递像这样的其他参数

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)

1 个答案:

答案 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 正在实现相同的结果,并且更容易遵循未来的维护者。