openpyxl 保存到实例字段 django

openpyxl save to instance field django

我想在每次使用 POST 提交表单时插入一个 excel sheet 文件。但是,文件必须先前在视图中生成,然后插入到instance.field.

型号:

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

查看:

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"})

除附件字段外的所有保存。我在这里做错了什么?

不能这样直接保存文件。保存后需要以二进制读取模式打开,然后将其传递给 File 构造函数:

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"})