在一个应用中,我有以下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
MyViewSet
用DefaultRouter
路由。我需要指定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
获得的视图使用正确的渲染器类?
答案 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.