Как добавить PDF, созданный ReportLab, в поле FileField в модели Django

В viws.py я могу создать PDF файл. Однако я не могу добавить его в поле FileField в модели.

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics

buffer = io.BytesIO()
cc = canvas.Canvas(buffer, pagesize=A4)

# describe something
font_name = "HeiseiKakuGo-W5"
pdfmetrics.registerFont(UnicodeCIDFont(font_name))
pdfCanvas.setFont(font_name, 7)
pdfCanvas.drawString(65*mm, 11*mm, 'test')

cc.showPage()
cc.save()
cc.seek(0)

# I can't add a PDF created above into a FileField in a model 
# someObject.someField.save('test.pdf', File(buffer))
# someObject.save()

return FileResponse(buffer, as_attachment=True, filename='receipt_pdf.pdf')

Вам может понадобиться seek(0) на вашем buffer, поскольку он использовался ранее, я не удивлюсь, что буфер будет в конце и приведет к пустому файлу, сохраненному в Django.

Я считаю, что вам не хватает buffer.get_value()

Я также использую ContentFile вместо File, хотя не уверен, что это необходимо.

Я только что протестировал следующий фрагмент, и он работает, используя reportlab==3.5.32

import io

from django.core.files.base import ContentFile
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas

from my_app.models import MyModel

buffer = io.BytesIO()
canv = canvas.Canvas(buffer, pagesize=A4)
canv.drawString(100, 400, "test")
canv.save()
pdf = buffer.getvalue()
buffer.close()

my_object = MyModel.objects.latest("id")
my_object.file_field.save("test.pdf", ContentFile(pdf))

Вернуться на верх