Я пытаюсь написать сценарий, который сохранит pdf файл, созданный xhtml2pdf, непосредственно на сервере, не выполняя обычный маршрут запроса пользователю загрузить его на свой компьютер. Документы() – это модель, которую я пытаюсь сохранить, и переменные new_project и output_filename устанавливаются в другом месте.
html = render_to_string(template, RequestContext(request, context)).encode('utf8')
result = open(output_filename, "wb")
pdf = CreatePDF(src=html, dest=results, path = "", encoding = 'UTF-8', link_callback=link_callback) #link callback was originally set to link_callback, defined below
result.close()
if not pdf.err:
new_doc=Documents()
new_doc.project=new_project
new_doc.posted_by=old_mess[0].from_user_fk.username
new_doc.documents = result
new_doc.save()
С этой конфигурацией, когда она достигает new_doc.save(), я получаю ошибку: объект “file” не имеет атрибута “_committed”
Кто-нибудь знает, как я могу это исправить? Благодарю!
Поиграв с ним, я нашел рабочее решение. Проблема заключалась в том, что я не создавал новый документ, пока результат (pdf) все еще был открытым.
“+” необходимо было добавить в open(), чтобы файл pdf был доступен для чтения и записи, а не просто для записи.
Обратите внимание, что это сначала сохраняет PDF файл в другой папке (файлы). Если это не является желательным результатом для вашего приложения, вам нужно будет удалить его.
html = render_to_string(template, RequestContext(request, context)).encode('utf8')
results = StringIO()
result = open("Files/"+output_filename, "w+b")
pdf = CreatePDF(src=html, dest=results, path = "", encoding = 'UTF-8', link_callback=link_callback) #link callback was originally set to link_callback, defined below
if not pdf.err:
result.write(results.getvalue())
new_doc=Documents()
new_doc.project=new_project
new_doc.documents.save(output_filename, File(result))
new_doc.posted_by=old_mess[0].from_user_fk.username
new_doc.save()
result.close()