Вопрос:

Как создать и сохранить файл в Django Model

python django

21 просмотра

1 ответ

35 Репутация автора

У меня есть представление, которое генерирует файл .docx для любой «ссылки #», которую выберет пользователь - я хотел бы, чтобы файл сохранялся в моей модели Orders каждый раз, когда генерируется документ.

models.py

#model where I'd like to save the doc each time it gets generated
class Orders(models.Model):

    reference = models.CharField(max_length=50, unique=True, error_messages={'unique':"This reference id has already been used"})
    ultimate_consignee = models.ForeignKey(Customers, blank=True)
    ship_to = models.CharField(max_length=500, blank=True)
    vessel = models.CharField(max_length=100, blank=True)
    ...
    order_file = #not sure what data type to use here

views.py

#view generating the .docx
def docjawn(request):

    reference = request.POST.get('Reference_IDs')
    referenceid = reference
    manifest = Manifests.objects.all().filter(reference__reference=referenceid)
    order = Orders.objects.get(reference=reference)

    doc = DocxTemplate("template.docx")
    totalCNF = 0
    totalFOB = 0
    for item in manifest:
        totalCNF += item.cases * item.CNF
        totalFOB += item.cases * item.FOB
    context = {

        'ultimate_consignee' : order.ultimate_consignee,
        'reference' : order.reference,
        'ship_to' : order.ship_to,
        'terms' : order.terms,
        'date' : "12",
        'ship_date' : "7/4/19",
        'vessel' : order.vessel,
        'POE' : order.POE,
        'ETA' : order.ETA,
        'booking_no' : order.booking_no,
        'manifest' : manifest,
        'totalCNF' : totalCNF,
        'totalFOB' : totalFOB,
}


    doc.render(context)

    doc_io = io.BytesIO() # create a file-like object
    doc.save(doc_io) # save data to file-like object
    doc_io.seek(0) # go to the beginning of the file-like object

    response = HttpResponse(doc_io.read())

    # Content-Disposition header makes a file downloadable
    response["Content-Disposition"] = "attachment; filename=generated_doc.docx"

    # Set the appropriate Content-Type for docx file
    response["Content-Type"] = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"

    return response

Хорошо, поэтому при доступе к представлению, приведенному выше, система должна сгенерировать файл и сохранить его в модели заказов WHERE reference = reference_id. Это возможно? Какие-либо предложения? Я действительно понятия не имею, как начать пытаться соединить два.

Автор: GXM100 Источник Размещён: 14.08.2019 12:28

Ответы (1)


0 плюса

2789 Репутация автора

Кажется, ваш взгляд довольно близок к тому, что вы хотите. В вашей модели добавьте FileFieldдля order_file:

class Orders(models.Model):

    ...
    order_file = models.FileField(upload_to='path/to/storage/', null=True, blank=True)

Затем, по вашему мнению, сохраните BytesIOсозданный вами объект в order_fileполе Ordersобъекта с правильным значением reference_id, обернув его в Fileобъект:

from django.core.files import File

def docjawn(request):

    reference = request.POST.get('Reference_IDs')
    manifest = Manifests.objects.all().filter(reference__reference=reference)
    order = Orders.objects.get(reference=reference)

    # Generate doc file
    ...

    doc_io = io.BytesIO()
    doc.save(doc_io)
    doc_io.seek(0)

    # Save the BytesIO to the field here
    order.order_file.save(filename="generated_doc.docx", File(doc_io))

    response = HttpResponse(doc_io.read())
    response["Content-Disposition"] = "attachment; filename=generated_doc.docx"
    response["Content-Type"] = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"

    return response
Автор: Mihai Chelaru Размещён: 14.08.2019 01:46
Вопросы из категории :
32x32