Проблемы с загрузкой и сохранением документа в django

У меня есть несколько проблем, не могу разобраться, может есть какие-то связи.

Проблема 1.1: файл экспортирован в документацию django и он работает, но когда я пытаюсь переименовать его, возникает ошибка. Я хочу, чтобы было так with pd.ExcelWriter(newdoc + 'output.xlsx') as writer:, чтобы у каждого файла было "новое" имя. Я получаю эту ошибку, TypeError at / unsupported operand type(s) for +: 'InMemoryUploadedFile' and 'str'

Проблема 1.2: Как добавить путь для сохранения?

Проблема 2: Я загружаю файл, но он пустой, а имя документа Donwload.xlsx. Я хочу, чтобы было так, но при этом возникает много ошибок...

filename = newdoc + '_calculated.xlsx'
response = HttpResponse(output, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response['Content-Disposition'] = 'attachment; filename=%s' % filename
return response

Когда я делаю это, я получаю следующее... в терминале UserWarning: Calling close() на уже закрытом файле. и это в браузере TypeError at / unsupported operand type(s) for +: 'InMemoryUploadedFile' and 'str'

Это views.py, и если код такой, то ошибок нет, но я загружаю пустой документ.

def my_view(request):
    if request.method == "POST":
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            output = io.BytesIO()    
            newdoc = request.FILES['docfile']

            dfs = pd.read_excel(newdoc, sheet_name=None, index_col=[0])

            with pd.ExcelWriter('output.xlsx') as writer: #problem 1 
                for name, df in dfs.items():
                    #pandas code for uploaded excel file
                    out.to_excel(writer, sheet_name=name)
                 
            output.seek(0)

            response = HttpResponse(output, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
            response['Content-Disposition'] = 'attachment; filename=%s.xlsx' % 'Download' #problem 2
            return response

    else:
        form = DocumentForm()
    return render(request, 'list.html', {'form': form})

output = io.BytesIO() Созданное вами здесь не было использовано вообще.

попробуйте изменить

with pd.ExcelWriter('output.xlsx') as writer:

to

writer = pd.ExcelWriter(output)

Иначе BytesIO может быть закрыт ExcelWriter'ом, и тогда Django попытается закрыть его снова. Что приведет к ошибке двойного закрытия.

Ваша проблема 2, похоже, является ошибкой типа.

filename = newdoc + '_calculated.xlsx'

ваш newdoc здесь не строка, а "InMemoryUploadedFile", вам, вероятно, нужно получить доступ к его имени, сделав

filename = f"{newdoc.name}_calculated.xlsx"
Вернуться на верх