1

我正在我的 API 上设置一个端点,它应该返回一个 XLSX 文件。DRF 文档提到https://github.com/wharton/drf-renderer-xlsx作为主要的外部渲染包,除了似乎也能够渲染 XLSX 的 pandas。

在他们的代码示例中,他们使用了与 mixin 配对的 ReadOnlyViewset,但没有提及它如何与 APIViews 一起使用。尽管如此,我还是想使用https://harshahegde.dev/rendering-xlsx-files-in-django-rest-framework-ckagk293p00eumks1bf4dlhie所示的 APIView 但是.. 这在使用 CURL 或 Postman 时效果很好,但是当通过浏览器完成我收到此错误:

'Request' object has no attribute 'accepted_renderer'

据我了解,这是因为没有设置 Accept 标头(例如 'Accept':'application/xlsx'),我通过从 renderer_classes 中删除 Mixin 来解决此问题,因此它只返回一个名为“xlsx”的文件,但我可以' t 弄清楚如何在没有 mixin 的情况下设置文件名。如何使用试图从浏览器访问 URL 的 APIView 设置文件名?

我的观点:

class SomedataXlsx(APIView):
    renderer_classes = [XLSXRenderer, JSONRenderer]

    def get(self, request):
        queryset = Somedata.objects.all()
        serializer = SomeDataSerializer(queryset, many=True)
        return Response(serializer.data)
4

1 回答 1

1

查看 mixin 代码,很明显它们更改了 content-disposition 标头,因此由于 DRF Response() 采用标头参数,我尝试更改它,并且效果很好。

class SomedataXlsx(APIView):
renderer_classes = [XLSXRenderer, JSONRenderer]
def get(self, request):
    user_sub_fund_data = Somedata.objects.all()
    serializer = SomeDataSerializer(queryset, many=True)
    return Response(serializer.data, headers={"content-disposition":"attachment; filename=mynewfilename.xlsx"})
于 2021-01-23T23:59:01.310 回答