Django - Сохранить объект Canvas в виде PDF-файла в FileField - PullRequest
0 голосов
/ 02 июля 2018

(Как) возможно ли сохранить объект холста в виде PDF-файла в FileField?

https://docs.djangoproject.com/en/2.0/howto/outputting-pdf/#outputting-pdfs-with-django

views.py

from django.views.generic.edit import FormView
from reportlab.pdfgen import canvas

class SomeView(FormView):

    form_class = SomeForm
    template_name = 'sometemplate.html'


    def form_valid(self, form):

        item = form.save(commit=False)

        # create PDF
        filename = "somefile.pdf"
        p = canvas.Canvas(filename)
        p.drawString(100, 100, "Hello world.")
        p.showPage()
        p.save()

        # this will not work, but i hope there is another way
        # Error: 'Canvas' object has no attribute '_committed'
        item.file = p

        # save form
        item.save()

        return super(SomeView, self).form_valid(form)

Traceback: (долго вставлять все)

[...]

Exception Type: AttributeError at /return/
Exception Value: 'Canvas' object has no attribute '_committed'

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать!

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Это не идеальный вариант, но он работает для записи файла (временного) на диск и затем сохранения его в FileField (после этого необходимо удалить временный файл, которого нет в коде)

from reportlab.pdfgen import canvas
from django.core.files import File
import codecs

class SomeView(FormView):

    form_class = SomeForm
    template_name = 'sometemplate.html'


    def form_valid(self, form):

        item = form.save(commit=False)

        # create PDF
        filename = "somefile.pdf"
        p = canvas.Canvas(filename)
        p.drawString(100, 100, "Hello world.")
        p.showPage()
        p.save()

        with codecs.open('somefile.pdf', "r",encoding='utf-8', errors='ignore') as f:   
           item.file.save('somefile.pdf',File(f))

        # save form
        item.save()

        return super(SomeView, self).form_valid(form)
0 голосов
/ 02 июля 2018

Попробуйте:

def some_view(request):
    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"'

    p = canvas.Canvas(response)
    p.drawString(100, 100, "Hello world.")
    p.showPage()
    p.save()

    return response
...