Home > Mobile >  Saving a file from FileResponse in Django
Saving a file from FileResponse in Django

Time:05-20

How to save file in FileField from FileResponse in Django.

I have the simplest PDF function to create PDF file in Django (according to the documentation).

import io
from django.http import FileResponse
from reportlab.pdfgen import canvas

def some_view(request):
    # Create a file-like buffer to receive PDF data.
    buffer = io.BytesIO()

    # Create the PDF object, using the buffer as its "file."
    p = canvas.Canvas(buffer)

    # Draw things on the PDF. Here's where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly, and we're done.
    p.showPage()
    p.save()

    # FileResponse sets the Content-Disposition header so that browsers
    # present the option to save the file.
    buffer.seek(0)
    return FileResponse(buffer, as_attachment=True, filename='hello.pdf')

It returns PDF. But how to save this PDF in FileField?

I need something like this:

Models.py

class FileModel(models.Model):
    file = models.FileField()

Views.py

def some_view(request):
    [...same code as above to line buffer.seek(0)...]
    obj = FileModel()
    obj.file = FileResponse(buffer, as_attachment=True, filename='hello.pdf')
    obj.save()

CodePudding user response:

For this task Django provides the File wrapper object:

from django.core.files import File

def some_view(request):
    # ...same code as above to line buffer.seek(0)...
    obj = FileModel()
    obj.file = File(buffer, name='hello.pdf')
    obj.save()
  • Related