En este tutorial continuaré con el framework Django. Si recordamos del post anterior ya aprendimos:
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 - Migraciones
Es un sistema que nos permite evolucionar nuestro esquema de la base de datos mientras desarrollamos nuestra aplicación. Este sistema nos permite hacer los cambios en la base de datos sin tener que usar código SQL directamente.
Como practica crearé un modelo que represente los comentarios realizados por un usuario a nuestro blog. Por ello modifico el archivo posts/models.py agregando la siguiente clase:
Ahora creamos la migración con el comando que vimos en el primer post python manage.py makemigrations posts este detectará automáticamente, que ya existe una migración anterior y por lo tanto creará el archivo con el nombre 0002_comentario.py, donde 0002 indica el número de migración en esta aplicación y comentario el nombre que refleja el cambio realizado. El archivo generado luce así:
Este lo podemos modificar y agregar, por lo tanto mayor detalle a la migración, como por ejemplo agregar funciones para un cálculo especial. En este caso el archivo refleja la creación del modelo en la base de datos, indicando que depende del archivo 0001_initial.py (migración creada en la primera parte del tutorial) y usa la función CreateModel con el nombre y atributos especificados en el posts/models.py.
Para realizar esta migración ejecutamos python manage.py migrate posts. Ya con esto contamos con el modelo a nivel lógico y con una tabla en la base de datos que le corresponde.
Y para seguir con la practica queremos agregar al modelo comentario el atributo autor, con el valor por defecto Tony, para ello agregamos únicamente la línea autor = models.CharField(max_length=200, default='Tony') a la clase Comentario en el posts/models.py. Nuevamente ejecutamos python manage.py makemigrations posts y con esto ya tendremos el siguiente archivo de migración:
Si observamos bien, nos percatamos que el archivo tiene la misma estructura que el anterior, lo que cambia son obviamente los parámetros y que en esta oportunidad usamos la función AddField, la cual requiere:
Otras operaciones que podemos llegar a realizar en una migración son:
2 - Operaciones con la base de datos
Esta sección más que un ejemplo, será para explicar las funciones que tenemos para interactuar con la base de datos. Entonces si revisamos el archivo de posts/views.py, podemos ver todas las funciones que normalmente se usan.
El modelo de usuario que tenemos en la base de datos ya se creo en la primera parte de este tutorial, este ya contiene los atributos de nombre de usuario y contraseña en el modelo. Además de eso tenemos una variable dentro del request al cual le podemos agregar información y esta se llama session. Podemos agregar contadores, mensajes, entre muchos otros y esto lo logramos con operaciones como: request.session['saludo'] = 'hola'. Si queremos eliminar esa información usamos del request.session['saludo'].
Con motivo de mostrar buenas prácticas crearé una aplicación extra llamada sesion (sin acento porque no puedo), con la cual veremos las funciones de autenticación y manejo de usuarios. La aplicación la creamos usando python manage.py startapp sesion, luego agregamos dentro la carpeta una carpeta llamada templates para tener los html que correspondan a esta aplicación. Y como primer archivo dentro de esta carpeta agregamos login.html con el siguiente contenido:
En este vemos un formulario de costumbre que usamos para pasar los datos del usuario para iniciar su sesión (líneas 5 -32) y uso de bloques para estructurar la página con mensajes de errores (líneas 35 - 42).
Para garantizar que podamos cerrar y abrir sesión agregamos al posts/templates/base.html lo siguiente:
Con esto ya podemos verificar si el usuario esta autenticado y por tanto mostrar el link adecuado para iniciar o cerrar sesión desde todas las vistas!
Luego modificamos el archivo sesion/views.py con el siguiente contenido:
En este ya encontramos los nuevos comandos:
Ahora queda notificar al proyecto y para eso agregamos dentro del archivo blog/urls.py la instrucción url(r'^sesion/', include('sesion.urls')),.
Por último dentro del archivo blog/settings.py agregamos a la lista de aplicaciones (INSTALLED_APPS) el valor 'sesion'.
La vista que tendremos resultante será la siguiente:
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.
- 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.
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 - Migraciones
Es un sistema que nos permite evolucionar nuestro esquema de la base de datos mientras desarrollamos nuestra aplicación. Este sistema nos permite hacer los cambios en la base de datos sin tener que usar código SQL directamente.
Como practica crearé un modelo que represente los comentarios realizados por un usuario a nuestro blog. Por ello modifico el archivo posts/models.py agregando la siguiente clase:
Ahora creamos la migración con el comando que vimos en el primer post python manage.py makemigrations posts este detectará automáticamente, que ya existe una migración anterior y por lo tanto creará el archivo con el nombre 0002_comentario.py, donde 0002 indica el número de migración en esta aplicación y comentario el nombre que refleja el cambio realizado. El archivo generado luce así:
Este lo podemos modificar y agregar, por lo tanto mayor detalle a la migración, como por ejemplo agregar funciones para un cálculo especial. En este caso el archivo refleja la creación del modelo en la base de datos, indicando que depende del archivo 0001_initial.py (migración creada en la primera parte del tutorial) y usa la función CreateModel con el nombre y atributos especificados en el posts/models.py.
Para realizar esta migración ejecutamos python manage.py migrate posts. Ya con esto contamos con el modelo a nivel lógico y con una tabla en la base de datos que le corresponde.
Y para seguir con la practica queremos agregar al modelo comentario el atributo autor, con el valor por defecto Tony, para ello agregamos únicamente la línea autor = models.CharField(max_length=200, default='Tony') a la clase Comentario en el posts/models.py. Nuevamente ejecutamos python manage.py makemigrations posts y con esto ya tendremos el siguiente archivo de migración:
Si observamos bien, nos percatamos que el archivo tiene la misma estructura que el anterior, lo que cambia son obviamente los parámetros y que en esta oportunidad usamos la función AddField, la cual requiere:
- model_name: Nombre del modelo.
- name: Nombre del atributo.
- field: Tipo del atributo.
Otras operaciones que podemos llegar a realizar en una migración son:
- CreateModel: Crea el modelo.
- DeleteModel: Elimina el modelo.
- RenameModel: Permite renombrar el modelo.
- AlterModelTable: Permite asociar a un modelo con otra tabla en la base de datos.
- AlterUniqueTogether: Modifica las condiciones de unicidad.
- AlterIndexTogether: Modifica los indices.
- AlterOrderWithRespectTo: Permite modificar el orden por defecto de la tabla.
- AddField: Agrega un atributo al modelo especificado.
- RemoveField: Elimina un atributo un modelo especificado.
- AlterField: Permite cambiar las especificaciones de un atributo para un modelo.
- RenameField: Permite cambiar el nombre de un atributo para un modelo.
2 - Operaciones con la base de datos
Esta sección más que un ejemplo, será para explicar las funciones que tenemos para interactuar con la base de datos. Entonces si revisamos el archivo de posts/views.py, podemos ver todas las funciones que normalmente se usan.
- Post.objects.all() Selecciona todos los Posts y entrega una lista en el orden por defecto en el que estaban almacenados.
- Post(nombre='Hola mundo', contenido='Funciona',pub_fecha=datetime.now(),autor='Tony') Crea una instancia del modelo Post con el nombre, autor, contenido y fecha en los argumentos.
- post.save() Almacena en la base de datos, la instancia que se tenga del modelo en la variable post.
- get_object_or_404(Post, pk=1) Permite seleccionar de la base de datos la instancia con id 1 en el modelo Post.
- Post.objects.get(nombre__exact='Hola') Busca en la base de datos dentro del modelo Post las instancias que tengan el nombre exactamente con el valor Hola. También existen otras operaciones de búsqueda __iexact (tiene exactamente el valor, pero no es sensible a mayúsculas y minúsculas) y __contains (contiene el valor).
- post.update(campo=valor) Permite actualizar la instancia del modelo que este en la variable post con los valores que corresponda a unos atributos especificados.
- post.delete() Elimina la instancia que este en la variable.
- Post.objects.filter Sólo deja instancias según los parámetros.
- Post.objects.exclude Excluye del grupo de la consulta a todas instancias que correspondan a los parámetros.
El modelo de usuario que tenemos en la base de datos ya se creo en la primera parte de este tutorial, este ya contiene los atributos de nombre de usuario y contraseña en el modelo. Además de eso tenemos una variable dentro del request al cual le podemos agregar información y esta se llama session. Podemos agregar contadores, mensajes, entre muchos otros y esto lo logramos con operaciones como: request.session['saludo'] = 'hola'. Si queremos eliminar esa información usamos del request.session['saludo'].
Con motivo de mostrar buenas prácticas crearé una aplicación extra llamada sesion (sin acento porque no puedo), con la cual veremos las funciones de autenticación y manejo de usuarios. La aplicación la creamos usando python manage.py startapp sesion, luego agregamos dentro la carpeta una carpeta llamada templates para tener los html que correspondan a esta aplicación. Y como primer archivo dentro de esta carpeta agregamos login.html con el siguiente contenido:
En este vemos un formulario de costumbre que usamos para pasar los datos del usuario para iniciar su sesión (líneas 5 -32) y uso de bloques para estructurar la página con mensajes de errores (líneas 35 - 42).
Para garantizar que podamos cerrar y abrir sesión agregamos al posts/templates/base.html lo siguiente:
Con esto ya podemos verificar si el usuario esta autenticado y por tanto mostrar el link adecuado para iniciar o cerrar sesión desde todas las vistas!
Luego modificamos el archivo sesion/views.py con el siguiente contenido:
En este ya encontramos los nuevos comandos:
- request.user.is_authenticated() Revisa si ya existe un usuario con sesión iniciada.
- authenticate(username=nombre, password=contraseña) Devuelve una instancia de Usuario en caso de encontrar los datos correctamente en la base de datos.
- .is_active Verifica si el usuario que se tiene en la instancia ya esta activo.
- login(request,usuario) Inicia la sesión del usuario.
- logout(request) Cierra la sesión que este activa.
Ahora queda notificar al proyecto y para eso agregamos dentro del archivo blog/urls.py la instrucción url(r'^sesion/', include('sesion.urls')),.
Por último dentro del archivo blog/settings.py agregamos a la lista de aplicaciones (INSTALLED_APPS) el valor 'sesion'.
La vista que tendremos resultante será la siguiente:
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.


