Estás en:   ArielOrtiz.com > Desarrollo de aplicaciones distribuidas > Laboratorio 6: Modelos en Django

Laboratorio 6: Modelos en Django

Objetivos

Durante esta práctica, los alumnos serán capaces de:

Esta actividad promueve las siguientes habilidades, valores y actitudes: análisis y síntesis, capacidad de resolver problemas, creatividad, y uso eficiente de la informática y las telecomunicaciones.

Descripción de la actividad

NOTA IMPORTANTE: Las actividades de la práctica se pueden elaborar de manera individual o en parejas. El reporte de la práctica de laboratorio debe ser desarrollado de manera individual.

Esta práctica consiste en crear una aplicación que permita consultar citas famosas de celebridades. Las citas estarán almacenadas en una base de datos.

Instrucciones preliminares

  1. Crea un nuevo proyecto de Django llamado lab6 y dentro de éste una nueva aplicación llamada citaplic. Puedes referirte al laboratorio 5 si no recuerdas como hacer esto. Crea los directorios static y templates, y ajusta las variables STATICFILES_DIRS y TEMPLATE_DIRS dentro del archivo settings.py. De esa misma práctica, copia el archivo base.html al directorio templates y el archivo estilos.css al directorio static.
  2. Ingresa al monitor de MySQL y crea una nueva base de datos llamada lab6. El laboratorio 2 explica como crear una base de datos.
  3. Para poder acceder a la base de datos desde Django se necesitan hacer algunos ajustes. En el archivo settings.py, completa la configuración de la base de datos:

    DATABASES = {
        'default': {
            'ENGINE':   'mysql',   # DBMS a usar.
            'NAME':     'lab6',    # Nombre de la base de datos.
            'USER':     'root',    # Nombre de usuario.
            'PASSWORD': 'secreto', # Password del usuario.
            'HOST':     '',        # Default: localhost           
            'PORT':     '',        # Default para MySQL: 3306
        }
    }

    En ese mismo archivo se debe agregar nuestra aplicación a la tupla de aplicaciones instaladas:

    INSTALLED_APPS = (
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        # Uncomment the next line to enable the admin:
        # 'django.contrib.admin',
        # Uncomment the next line to enable admin documentation:
        # 'django.contrib.admindocs',
        'lab6.citaplic',
    )  
    
  4. Procederemos ahora a crear un modelo, el cual será mapeado a una tabla en la base de datos. El modelo consistirá de:

    • autor: campo de texto de hasta 50 caracteres.
    • texto: campo de texto de hasta 500 caracteres.

    Abre en un editor el archivo lab6/citaplic/models.py y copia el siguiente contenido:

    from django.db import models
    
    class Cita(models.Model):
        autor = models.CharField(max_length=50)
        texto = models.CharField(max_length=500) 
        
        def __unicode__(self):
            return u'(%s) %s' % (self.id, self.autor)
    

    El nombre del modelo (Cita) debe ser un sustantivo en singular y comenzar con una letra mayúscula.

    El método __unicode__ sirve para indicar la representación textual (en Unicode) que deseamos que tengan las instancias del modelo. Esto es útil principalmente durante la etapa de desarrollo y depuración.

    La tabla de la base de datos correspondiente a este modelo será creada automáticamente. El nombre de dicha tabla será el nombre de la aplicación, seguido de un guión bajo, seguido del nombre del modelo, todo en letras minúsculas. El nombre de la tabla para nuestro caso es: citaplic_cita.

  5. Para establecer la información inicial contenida en la base de datos, se puede crear un script SQL de inicialización. Primero, se debe crear un directorio sql debajo del directorio de la aplicación (en nuestro caso lab6/citaplic). En ese directorio se debe guardar el script cuyo nombre debe ser el mismo que el modelo, pero todo con letras minúsculas y con extensión .sql:

    -- Archivo: lab6/citaplic/sql/cita.sql
    
    insert into citaplic_cita (autor, texto) values ('Richard Stallman',
        'La historia nos enseña que debemos valorar nuestra libertad, de lo
        contrario la perderemos.');
    insert into citaplic_cita (autor, texto) values ('Steve Jobs', 
        'La única manera de hacer una gran obra es amando lo que haces.');
    insert into citaplic_cita (autor, texto) values ('John von Neumann',
        'No tiene sentido ser preciso cuando no se tiene idea de lo que se está
        hablando.');
    insert into citaplic_cita (autor, texto) values ('Steve Wozniak',
        'Al parecer, a las mejores personas de esta vida les gusta Linux.');
    insert into citaplic_cita (autor, texto) values ('Paul Graham',
        'Un lenguaje de programación debe servir para pensar acerca de un programa,
        no para expresar un programa el cual ya hemos pensado. Debe ser un lápiz, no
        una pluma.');
    insert into citaplic_cita (autor, texto) values ('Richard Stallman',
        'La gente dijo que debía aceptar el mundo. ¡Tonterías! Yo no acepto al
        mundo.');
    insert into citaplic_cita (autor, texto) values ('Bill Gates',
        'La vida no es justa; acostúmbrate a eso.');
    insert into citaplic_cita (autor, texto) values ('Steve Jobs', 
        'Tu tiempo es limitado, así que no lo desperdicies viviendo la vida de
        alguien más.');
    insert into citaplic_cita (autor, texto) values ('Steve Wozniak',
        'Mi meta no era hacer un dineral, sino construir buenas computadoras.');
    insert into citaplic_cita (autor, texto) values ('Steve Jobs', 
        'No puedes unir los puntos viendo hacia adelante; solo los puedes conectar
        viendo hacia atrás.');
    insert into citaplic_cita (autor, texto) values ('Bill Gates',
        'El éxito es un pésimo maestro. Seduce a la gente inteligente haciéndoles
        creer que no pueden perder.');
    insert into citaplic_cita (autor, texto) values ('Bill Gates',
        'La siguiente generación de software interesante será desarrollada en la
        Macintosh, no en la IBM PC.');
    insert into citaplic_cita (autor, texto) values ('John von Neumann',
        'Tal parece que hemos alcanzado los límites de que lo que es posible hacer
        con la tecnología computacional, aunque uno debe ser cuidadoso con este tipo
        de declaraciones, ya que suelen sonar bastante bobas en 5 años.');
    

    Ahora es necesario sincronizar las definiciones del modelo con la base de datos. Desde la terminal teclea:

    python manage.py syncdb

    Se te preguntará si deseas definir un superusuario. Teclea yes, y proporciona la información solicitada.

    Opcionalmente, si quieres ver el código de SQL que se utilizó para crear las tablas correspondientes a los modelos de la aplicación citaplic (en este caso solo hay un modelo), teclea desde la terminal:

    python manage.py sql citaplic

    Vale la pena notar que Django automáticamente agrega un campo entero autoincrementable llamado id el cual servirá como llave primaria de la tabla.

  6. Ejecuta el siguiente comando desde la terminal para abrir una sesión interactiva de Python que tenga acceso a nuestro proyecto:

    python manage.py shell

    En la sesión interactiva, teclea los siguientes comandos para comprender la manera de utilizar los modelos desde código escrito en Python:

    from lab6.citaplic.models import Cita
    
    # Crear una nueva instancia de Cita
    a = Cita(autor='Linus Torvalds', 
             texto='El software es como el sexo: es mejor cuando es gratis.')
    a.save()
    
    # Obtener una colección con todas las citas
    b = Cita.objects.all() 
    
    # Obtener una cita a partir de su id
    c = Cita.objects.get(id=7)
    
    # Obtener los valores de los campos de una cita
    d = c.id
    e = c.autor
    f = c.texto
    
    # Borrar una cita (previamente obtenida)
    c.delete()
    
    # Obtener todas las citas que tengan un campo igual a un cierto valor
    g = Cita.objects.filter(autor='Steve Jobs')
    
    # Ordenar a partir de un campo
    h = Cita.objects.order_by('autor')
    
    # Ordenar a partir de un campo en orden descendente
    i = Cita.objects.order_by('-autor')
    
    # Ordenar usando varios campos
    j = Cita.objects.order_by('autor', 'texto')

    Para más información al respecto, revisa la documentación sobre cómo hacer consultas en Django.

Problema

Escribe las vistas y plantillas necesarias (y ajusta el archivo urls.py) para que la aplicación funcione como se describe a continuación.

Primeramente, al acceder al URL http://localhost:8000/citas/ debe aparecer una página en la que se listen en orden ascendente todos los autores de las citas que se tienen almacenadas en la base de datos:

Como se puede observar, cada nombre de autor de la lista es una liga. En la plantilla, dichas ligas se pueden generar con un código similar a este (asumiendo que nombre es una variable de plantilla establecida desde la vista):

<a href="/autor/?quien={{ nombre|urlencode }}">{{ nombre }}</a>

En este caso, se está refiriendo al URL "/autor/" con un parámetro llamado quien, el cual contiene el nombre de un autor. El filtro urlencode se encarga de que solo queden caracteres válidos (no puede haber espacios en blanco ni otros caracteres especiales) en el URL final resultante. Por ejemplo, para el código anterior (suponiendo que nombre es "Steve Jobs"), lo que el navegador finalmente ve es algo así:

<a href="/autor/?quien=Steve%20Jobs">Steve Jobs</a>

Cuando el usuario haga clic en alguna de las ligas de los autores de la lista, debe aparecer una nueva página con todas las citas del autor seleccionado:

Dentro del código de la vista asociada al URL "/autor/", se puede obtener el valor del parámetro quien de la siguiente manera:

def autor(request):
    nombre = request.GET['quien']
    # el resto del código va aquí ...     

Por último, verifica que todas las página producidas sean HTML5 válido utilizando el Servicio de Validación de W3C.

¿Qué se debe entregar?

Para entregar tu trabajo individual, sigue las siguientes instrucciones:

Fecha límite: Martes, Marzo 6.

Evaluación

Esta actividad será evaluada usando los siguientes criterios:

50% Implementación de los requerimientos.
50% Reporte de la práctica de laboratorio.
DA El programa y/o reporte es un plagio.