O Django cria documentos .odt ou .docx para download

Eu preciso gerar arquivos .odt ou .docx com base nas informações que tenho em meu database. Digamos que eu tenha um modelo:

class Contact(models.Model): first_name = models.CharField() last_name = models.CharField() email = models.EmailField() 

Eu quero que os usuários sejam capazes de gerar documentos de escritório que contenham essas informações e também algum outro texto. Eu dei uma olhada para este exemplo que está usando python-docx e me dá uma idéia de como gerar esse documento. Mas não consigo descobrir onde esse arquivo é salvo ou é criado. No meu template eu tenho um link:

 generate .docx document 

onde generate_docx() executa o código que pode ser encontrado no link fornecido acima.

Como posso implementar meu sistema para que, quando meu link for clicado, o documento seja criado ou atualizado com base nos dados do database e depois do download para o computador do usuário? Não é obrigatório salvar esse documento no database, mas também estou interessado em saber como fazer isso.

Você pode usar a linguagem de modelo do django dentro de um arquivo docx, que é realmente um arquivo zip de arquivos xml, e então executar o arquivo xml apropriado através do mecanismo de template. Eu tenho a idéia aqui: http://reinout.vanrees.org/weblog/2012/07/04/document-automation.html

É mais fácil dizer do que fazer. Eventualmente, eu consegui rodar em python3 assim:

 from zipfile import ZipFile from io import BytesIO from django.template import Context, Template def render_to_docx(docx, context): tmp = BytesIO() with ZipFile(tmp, 'w') as document_zip, ZipFile(docx) as template_zip: template_archive = {name: template_zip.read(name) for name in template_zip.namelist()} template_xml = template_archive.pop('word/document.xml') for n, f in template_archive.items(): document_zip.writestr(n, f) t = Template(template_xml) document_zip.writestr('word/document.xml', t.render(Context(context))) return tmp 

E na visão:

 response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') response['Content-Disposition'] = 'attachment; filename=document.docx' zipfile = render_to_docx('template.docx'), context_dictionary) response.write(zipfile.getvalue()) return response 

Você pode criar seu arquivo .docx usando o Py2docx ( https://github.com/rafaels88/py2docx ). Coloque seu código em uma visão e depois disso você pode fazer isso:

 # Here goes the Py2docx code # After save the .docx file, do this: file_docx = open("path/file.docx", 'r') response = HttpResponse(mimetype='text/html') response['Content-Disposition'] = 'attachment; filename=file_name.docx' response['Content-Encoding'] = 'UTF-8' response['Content-type'] = 'text/html; charset=UTF-8' response.write(file_docx.read()) file_docx.close() return response 

Em seguida, crie um link em HTML para o URL da sua visualização.

Se o pdf também é um formato aceitável, você pode considerar usar o django-wkhtmltopdf . Ele permitirá que você crie uma página normal e a converta em pdf usando uma forma binária de webkit.