openpyxl сохранить в поле экземпляра django - PullRequest
0 голосов
/ 10 февраля 2020

Я хотел бы вставить файл листа Excel каждый раз, когда я отправляю форму, используя POST. Файл, однако, должен быть ранее сгенерированным в представлениях и после, вставленным в instance.field.

Модель:

class Order(models.Model):
    ...
    attachment = \
    models.FileField(\
        _("Sheet"), 
        upload_to='uploads/', 
        max_length=100,
        blank=True, null=True)
   ...

View :

from openpyxl import Workbook
from openpyxl.writer.excel import save_virtual_workbook

class Order1(View):
     def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)

            #Creating sheet
            book = Workbook()
            sheet = book.active
            sheet['A1'] = 56
            sheet['A2'] = 43
            now = time.strftime("%x")
            sheet['A3'] = now

            #Calling model field instance - What im doing wrong here?
            obj.attachment = book.save("sample.xlsx")

            #Saving model instance
            obj.save()

            #Some return - required for AJAX
            return JsonResponse({"status": "OK"})

Все сохранения, кроме поля Attachemnt. Что я здесь не так делаю?

1 Ответ

1 голос
/ 10 февраля 2020

Вы не можете напрямую сохранить файл таким образом. Вам нужно будет открыть его в режиме двоичного чтения после сохранения, а затем передать его конструктору файлов:

from django.core.files import File
from openpyxl import Workbook
from openpyxl.writer.excel import save_virtual_workbook

class Order1(View):
     def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            obj = form.save(commit=False)

            #Creating sheet
            book = Workbook()
            sheet = book.active
            sheet['A1'] = 56
            sheet['A2'] = 43
            now = time.strftime("%x")
            sheet['A3'] = now

            #Calling model field instance - What im doing wrong here?
            book.save("sample.xlsx")
            with open('sample.xlsx', 'rb') as f:
                obj.attachment.save("sample.xlsx", File(f), save=False)

            #Saving model instance
            obj.save()

            #Some return - required for AJAX
            return JsonResponse({"status": "OK"})
...