Planet Python

How To Generate Documents ODT With Secretary

Sometimes due to the needs of a project, we need to create odt documents to represent information that we have in our application. This task can be light using the Secretary library.

What is Secretary?

Secretary is a library that allows you to use documents in ODT format to render documents using django

Secretary uses the semantics of jinja2 templates  and most of its functionalities can be used in the generation of these documents, some very important as "variable printing, filters and flow control''. 



pip install secretary

To show the use of this library, we create a model that contains people with 3 data (name, surname and email). The idea is to generate a document that contains a table with the data of all the people. We started!

1º We add a new url in to associate our new view that will generate the document.

from django.conf.urls import url
from . import views

urlpatterns = [
   url(r'^generate/document/$', views.generate_document,name='generate_document')

2º We created a very simple view to render and create the http response in our To reduce logic in the view, we create a class with a static method where the rendering of the document is performed and the HTTP response is created.

from .models import Person
from .logic import ReportGenerator

def generate_document(request):
   # Model data
   people = Person.objects.all().order_by('last_name')

   return ReportGenerator().create_report(people)
from secretary import Renderer
from django.http import HttpResponse
import os, tempfile

class ReportGenerator():
   """ Class ReportGenerator """

   def create_report(data):
       engine = Renderer()
       root = os.path.dirname(__file__)
       document = root + '/templates/bedjango/template.odt'
       result = engine.render(document, data=data)

       response = HttpResponse(content_type='application/vnd.oasis.opendocument.text; charset=UTF-8')
       response['Content-Disposition'] = 'inline; filename=people.odt'
       with tempfile.NamedTemporaryFile() as output:
           output = open(, 'r')

       return response

3º We create an odt document that will serve as a template to render information of the people of our application. I remember that we should use Jinja2 syntax.



4º We check the result.



As you can see, we have generated a very fast document odt with the data of the people of our application. I hope you liked this post. Do not hesitate to ask!


About the author

Let’s have a coffee and talk about your project


Let’s have a coffee and talk about your project


We use cookies to ensure you get the best experience on our website. More info.