Django Создать временный файл для скачивания - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть модель с именем 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)

Также, как я могу использовать get_queryset внутри функции post, потому что мой текущий код не возвращает объектов?

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете использовать tempfile модуль

Вот базовый пример c:

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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...