Направление выходных путей измененных файлов - PullRequest
0 голосов
/ 16 апреля 2020

Как я могу направить место назначения выходного файла на мою базу данных?

Мой models.py структурирован следующим образом:

class Model(models.Model):
    char    = models.CharField(max_length=50, null=False, blank=False)
    file    = models.FileField(upload_to=upload_location, null=True, blank=True)

У меня есть пользователь, который вводит значение для 'char', а затем значение 'char' печатается в файле , Процесс успешной печати в файл работает, однако файл выводится в мою исходную директорию.

Моя цель - сделать так, чтобы выходной файл 'pdf01.pdf' выводился на мою базу данных и был представлен как 'файл', чтобы администратор мог его прочитать.

Большая часть информации в Документы Dan go были сосредоточены на направлении пути объектов, импортируемых пользователем напрямую, а не на файлы, которые были созданы внутри. Я читал в основном из этих документов:

Поля моделей

Модели

Объекты ответа на файл

Вывод PDF-файлов

Я видел, что рекомендую записать в буфер, а не в файл, затем сохранить содержимое буфера в моей БД, однако я не сделал удалось найти много примеров того, как сделать это, относящихся к моей ситуации в Интернете.

Возможно, в моих знаниях есть существенный пробел относительно буферов и BytesIO? Вот функция, которую я использовал для изменения pdf, я использовал BytesIO для временного хранения файлов на протяжении всего процесса, но не смог выяснить, как использовать его для направления вывода в любое место, указанное c.

        can = canvas.Canvas(BytesIO(), pagesize=letter)
        can.drawString(10, 10, char)
        can.save()
        BytesIO().seek(0)
        text_pdf = PdfFileReader(BytesIO())
        base_file = PdfFileReader(open("media/01.pdf", "rb"))
        page = base_file.getPage(0)
        page.mergePage(text_pdf.getPage(0))
        PdfFileWriter().addPage(page)
        PdfFileWriter().write(open("pdf01.pdf", "wb")

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Я нашел этот обходной путь, чтобы направить файл в нужное место (в данном случае и мою папку media_cdn, и вывести ее администратору.)

Я настроил действие администратора для выполнения функции, которая выводит файл, так что администратор будет иметь доступ как к выходной версии в виде ответа HTTP, так и через хранилище media_cdn.

Надеюсь, это поможет любому, кто борется с той же проблемой.

#admin.py

class edit_and_output():

    def output:

        author = Account.email
        #alter file . . .

        with open('media_cdn/account/{0}.pdf'.format(author), 'wb') as out_file:
            output.write(out_file)
        response = HttpResponse(content_type='application/pdf')
        response['Content-Disposition'] = 'attachment;filename="{0}.pdf"'.format(author)
        output.write(response)
0 голосов
/ 17 апреля 2020

FileField не хранит файлы непосредственно в базе данных. Файлы загружаются в расположение в файловой системе, определяемое аргументом upload_to. В БД хранятся только некоторые метаданные, включая путь к файлу в вашей файловой системе.

Если вы хотите хранить содержимое файлов в базе данных, вы можете создать новую модель File, которая включает в себя BinaryField для хранения данных и CharField для хранения URL, с которого можно извлечь файл. Для передачи данных PdfFileWriter в двоичное поле Django, возможно, наиболее подходящим будет использование BytesIO .

...