Exportar archivos en el administrador de Django

18 de Mayo de 2019

Para inaugurar el blog me gustaría compartir una manera sencilla de exportar los registros de nuestros modelos desde el administrador de django. No me detendré a explicar los modelos ni el propio administrador, para ello es mejor darse una vuelta por la documentación oficial o por alguno de los tutoriales que abordan perfectamente el tema.


Indice:

¿Qué necesitamos? En afán de mantener esto simple y evitar distraernos con otras cosas, todo lo que necesitaremos se encuentra en este repositorio. Cabe destacar que el repositorio es un proyecto base que incluye todo lo que aquí no veremos.


Se usó: Django 2.2.1 y Python 3.7


Lo primero que busco normalmente al entrar en algún tutorial es el código; a continuación colocaré la función que nos ocupa, para aquellos que como yo prefieren inspeccionar directamente el código antes de leer acerca de su funciónamiento:

La acción

By default, after an action is performed the user is simply redirected back to the original change list page. However, some actions, especially more complex ones, will need to return intermediate pages.

Una acción en django no es otra cosa que una función donde se procesan los registros seleccionados. Dicha función puede también enviarnos a una pagina intermediara, ya sea para mostrar el resultado o algun formulario. En nuestro caso la función nos enviará un archivo csv con toda la información, ya hablaremos de ello más adelante.

Toda acción recibe tres parametros con información que podemos o no utilizar, en nuestro caso únicamente haremos uso del queryset, este parametro contiene todos los registros seleccionados.

Como habrás notado, posterior a declarar la función, hemos actualizado mediante la variable short_description el texto con el cual identificaremos nuestra acción.

Es necesario declarar la función antes del ModelAdmin ya que dentro de este la mandaremos llamar de la siguiente manera:

La respuesta HTTP

In contrast to HttpRequest objects, which are created automatically by Django, HttpResponse objects are your responsibility. Each view you write is responsible for instantiating, populating, and returning an HttpResponse.

Para que la acción nos regrese el archivo csv es necesario crear una respuesta HTTP con los encabezados correspondientes. Dichos encabezados servirán para que el navegador entienda que debe descargar la información en un archivo y no mostrarla como normalmente lo hace cuando accesamos a un sitio web.

El archivo CSV

Python comes with a CSV library, csv. The key to using it with Django is that the csv module’s CSV-creation capability acts on file-like objects, and Django’s HttpResponse objects are file-like objects.

Para crear nuestro archivo ocuparemos la librería csv con la cual crearemos nuestro objeto writer, normalmente hariamos que nuestro objeto escriba directamente sobre el archivo, en esta ocasión escribirá sobre la respuesta que previamente creamos con sus respectivos encabezados.

Para mantener cierto formato en nuestro archivo enviamos la primera fila con writerow y en ella la descripción de las columnas.

Ya para terminar únicamente iteramos sobre el queryset para procesar cada registro de manera individual.


Conclusión:

Espero que este post haya sido de utilidad, considero que este ejemplo es la manera más sencilla de generar archivos a partir de los registros en el administrador. Si estás interesado en llevar esto al próximo nivel y exportar en otros formatos de archivo te recomiendo automate the boring stuff.

Comentarios:

Tu correo es necesario para evitar spam, este jamás se mostrará a terceros.

Se enviará correo únicamente para validar que eres dueño del mismo.

Los comentarios aparecerán en la página en cuanto sean aprobados por el administrador