sábado, 6 de junio de 2015

Tutorial Django: Parte III


​ En este tutorial continuaré con el framework Django. Con la primera y segunda parte ya aprendimos:
  • A instalar la herramienta.
  • Crear un proyecto.
  • Crear una aplicación y modelo.
  • CRUD de un modelo.
  • Uso de archivos estáticos.
  • Configuración básica del admin.
  • Migraciones.
  • Operaciones con la base de datos.
  • Manejo de sesión.

Por tanto continuaré a partir de ese punto. Consulta el repositorio de este proyecto en Github y su último commit como punto de arranque de este tutorial aquí.

1 - Personalización del Admin

Con la herramienta del admin que ya vimos en la primera parte de esta serie de tutoriales de Django nos dimos cuenta de la gran cantidad de trabajo que nos ahorra a la hora de administrar nuestra aplicación, sin embargo puede que queramos personalizarlo un poco más. Esto último lo lograremos modificando posts/admin.py:


  • El primero de los grandes cambios es el uso de la clase ModelForm, esto permite dar formato a los formularios y en este caso se le asigna formato de área de texto al atributo contenido. La línea 14 habilita su uso dentro del administrador para el Post. Para el uso de esta clase es necesario importar forms tal y como se muestra en la línea 2.
  • Otro aspecto es habilitar el uso de un buscador según el nombre o contenido del Post (línea 15).
  • fieldsets nos permite describir un poco más los atributos (línea 16).

Además de todo esto incluí un atributo publicado_recientemente en la variable list_display y hasta ahora nuestro modelo no conoce este atributo, por lo que tengo que modificar posts/models.py como sigue:

En la línea 13 se encuentra implementada una función llamada publicado_recientemente con el cual sabremos si se publico el post recientemente o no. Además en su declaración se le incorpora una descripción, campo y su tipo, según los estándares de django.


Otro aspecto interesante es que el usuario que tenemos la base de datos hasta ahora es administrador y esto se logró por un primer comando que usamos en la primera parte del tutorial python manage.py createsuperuser, pero si queremos crear otro usuario, podemos usar la herramienta del administrador.


Ahora bien podemos asignar otra serie de permisos y hacer que este usuario sea un usuario normal. Los atributos que podemos cambiar dentro de los permisos de un usuario son:
  • Activo Indica si el usuario debe ser tratado como activo. Desmarque esta opción en lugar de borrar la cuenta.
  • Staff Indica si el usuario puede entrar en este sitio de administración.
  • Superusuario Indica que este usuario tiene todos los permisos sin asignárselos de forma explícita.
Además de todo esto podemos cambiar el aspecto de nuestra página de admin, simplemente copiando el contenido de la carpeta django/contrib/admin/templates en un subdirectorio dentro de templates/admin en la aplicación. Modificamos tanto como queramos los archivos y tendremos otra página de administrador a nuestro gusto. Todos los archivos que se pueden modificar son los siguientes:


El commit hasta este punto del proyecto.

2 - Comandos

Podemos crear nuestros propios comandos con manage.py y esto se logra agregando un subdirectorio llamado management dentro de la aplicación. Luego agregamos un archivo vacío llamado __init__.py y otra carpeta llamada commands. Dentro de esta última ya podremos agregar los comandos!

Agregando el archivo anterior seremos capaces de ejecutar python manage.py saludar y lograr ver en pantalla el mensaje Hola hola!. La estructura más básica de la implementación de un comando es la que muestro en ese archivo.
  • Uso de la clase BaseCommand como padre.
  • Especificación de argumentos.
  • Una descripción del comando.
  • Un handle que se encargará de ejecutar todas las instrucciones del comando.
El commit hasta este punto del proyecto.

3 - Introducción a las pruebas

Las pruebas que voy a realizar serán al modelo y las vistas de la aplicación.

Es necesario tener dentro de la aplicación una carpeta llamada fixtures, que es donde almacenaremos las instancias de prueba para los modelos. Una instancia de prueba luce como el siguiente archivo:

Después crearé un archivo llamado __init__.py dentro de la carpeta tests de la aplicación. En este caso el archivo no estará vacio ya que se incluirá los nombres de los archivos de prueba a realizar. El archivo lucirá como sigue:

Un archivo de prueba de modelo luce como el siguiente:


  • assertFalse Esta prueba espera que sea falso el resultado de la prueba.
  • assertTrue Esta prueba espera que sea verdadero el resultado de la prueba.
Para la prueba de vistas se tiene un archivo como el siguiente:

Esta prueba espera comprobar que el estado de la respuesta sea con el código 200 y que dentro del contexto se tenga la lista de posts.

Si vemos con atención la prueba esta usando el view con el nombre posts_index, esto quiere decir que debe existir ese view y eso se logra modificando el posts/urls.py de la siguiente forma:

A esto se le conoce como agregar un alias a los urls.

Finalmente para conocer el resultado de las pruebas sobre posts ejecutamos el comando python manage.py test posts.tests​ y obtendremos un resultado como este: ​ ​


El commit hasta este punto del proyecto.

Como siempre, si algo no queda muy claro siempre me pueden escribir a mi correo tonylattke@gmail.com o también pueden dejar comentarios al final de este post y trataré de ayudarles lo antes posible.