Django创建临时文件供下载

问题描述 投票:0回答:1

我有一个名为ReportData的模型。我有一个将获取“ report_name”并执行操作的表格。此操作基本上遍历对象,返回的每个对象都有一个文件字段,该文件字段包含“ .docx”文件,此功能会将所有这些文件合并为一个docx文件。

此后,convert()方法会将'docx'转换为'pdf'。我能够执行此工作流程,但是我需要在媒体目录中创建一个临时文件而不是实际文件。我的基于类的视图如下:

class FilesListView(LoginRequiredMixin,ListView):
    model = ReportData
    template_name = 'report/myfiles.html'
    context_object_name = 'reportdata'

    def get_queryset(self):
        return ReportData.objects.filter(preparedby=self.request.user).order_by('-date_created')

    def post(self,request,*args,**kwargs):
        filtervalue = request.POST.get("report_name","")
        reportsforPDF = ReportData.objects.filter(reportname=filtervalue)
        reporturl = settings.MEDIA_ROOT[0:-6]
        master = Document(reporturl + reportsforPDF.first().document.url)
        composer = Composer(master)
        i=0
        for object in reportsforPDF:
            if i>0:
                doc = Document(reporturl + object.document.url)
                composer.append(doc)
            i+=1
        storage = settings.MEDIA_ROOT + '/merged/{}.docx'.format(filtervalue)
        composer.save(storage)
        pythoncom.CoInitialize()
        convert(settings.MEDIA_ROOT + '/merged/{}.docx'.format(filtervalue))
        context = {
            'pdf_url': '/media/merged/{}.pdf'.format(filtervalue)
        }
        return render(request, 'report/myfiles.html', context=context)

由于我当前的代码未返回任何对象,我还可以在post函数中使用get_queryset吗?

django
1个回答
0
投票

您可以使用tempfile模块

这里是基本示例:

import os
f = tempfile.TemporaryFile()
f.write("Hello World")
f.seek(os.SEEK_SET)

# Do something
f.read()
# Do something

f.close() # Deletes

您可以在post方法中使用以下行:_queryset = self.get_queryset()

© www.soinside.com 2019 - 2024. All rights reserved.