Как добавить 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))