Сохранить doc-файл на сервер, и потом выдать ссылку на него на странице пользователю
Есть класс models.Model, в нем помимо всего прочего, есть поле FileField. Пользователь заполняет формы, и в конце ему должен выдаваться doc-файл с правильно подставленными данными (которые он вводил).
Я реализовал сохранение doc-файлов с пользовательскими данными, но без участия класса models.Model. Теперь получается, что у меня есть сохраненные файлы, но я никак не могу сформировать ссылки на скачивание.
Все попытки это сделать по советам из интернета приводят либо к ошибке кодировки, либо к тому что сохраненный файл тупо не открывается. Это я пробовал поставить "ignore" на ошибки.
Подскажите пожалуйста, как мне сделать так, чтобы файл сохранялся, и при этом потом можно было его "вытащить" из поля FileField, чтобы сделать ссылку для пользователя?
Вот часть класса, где объявляю поле для документа:
class Medic(models.Model):
statement = models.FileField(blank=True)
Вот view-функция, которая делает файл, но не может сделать ссылку на скачивание:
from docxtpl import DocxTemplate
from django.core.files.base import ContentFile, File
from .models import Medic
def create_docs(medic_id, context, type):
doc = DocxTemplate(template)
doc.render(context)
file_name = f"docs/statements/{context['id']}. {type} {context['second_name']}_{context['name']}_{context['patronymic']}.docx"
doc.save(file_name)
medic = Medic.objects.get(id=medic_id)
with open(file_name) as f:
medic.statement.save(file_name, File(f))
Все что после doc.save(file_name) не работает. Там валятся ошибки, которые, как я понимаю, связаны с тем, что изначально файл не является экземпляром класса.
Подскажите, пожалуйста, как правильно реализовать эту функцию?
Ответы (1 шт):
Таки придумал как реализовать рабочее решение. Оставлю здесь, вдруг кому пригодится.
from docxtpl import DocxTemplate
from django.http import FileResponse
from django.shortcuts import get_object_or_404
from .models import Medic
def create_docs(medic_id, context, type):
doc = DocxTemplate(template)
doc.render(context)
file_name = f"docs/statements/{context['id']}. {type} {context['second_name']}_{context['name']}_{context['patronymic']}.docx"
doc.save(file_name)
medic = get_object_or_404(Medic, id=medic_id)
with open(file_name, 'rb') as f:
medic.statement.save(file_name, File(f))
# Возвращаем ссылку на скачивание файла
return medic.statement.url