在ViewSet上使用“ as_view”方法检索视图时,动作装饰器kwargs没有传递

时间:2019-05-23 15:44:08

标签: django django-rest-framework

在一个应用中,我有以下ViewSet

class MyViewSet(MyGenericViewSet, ListModelMixin):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

    @action(detail=False, methods=["post"], accepted_renderers=(MyJsonRenderer,))
    def custom_action(request, *args, **kwargs):
        # Do some stuff here

MyViewSetDefaultRouter路由。我需要指定MyJsonRenderer,因为它在我的DEFAULT_RENDERERS设置中排第二(我首先具有HTML渲染器),并且该特定操作并不意味着要与Web浏览器一起使用。当我用POST请求访问路由URL时,它工作正常,并且始终返回JSON内容。

但是,我还需要使网站适应旧的AJAX API,因此在另一个adapter应用中,我具有以下基于功能的视图:

@csrf_exempt
def ajax(request, *args, **kwargs):
    custom_action_view = MyViewSet.as_view({"post": "custom_action"})
    return custom_action_view(request, *args, **kwargs)

如果我的请求未在其标头或参数中指定期望JSON内容,则内容协商失败,因为使用了默认的HTML渲染器(500 Internal Server Error)。该操作在服务器上执行,但未呈现响应。

如何使通过as_view获得的视图使用正确的渲染器类?

1 个答案:

答案 0 :(得分:1)

您可以使用@renderer_classes(MyJsonRenderer)装饰器来指定要与基于函数的视图一起使用的渲染器类。

如果需要将渲染器传递到MyViewSet.as_view()调用中,则可以在调用中指定renderer_classes=(MyJsonRenderer,),即MyViewSet.as_view({"post": "custom_action"}, renderer_classes=(MyJsonRenderer, ))The as_view() function accepts a list of keyword arguments to override several view settings.