Estás en:   ArielOrtiz.com > Desarrollo de aplicaciones distribuidas > Laboratorio 8: Relaciones en Django

Laboratorio 8: Relaciones 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 laboratotio debe ser desarrollado de manera individual.

En esta práctica se estarán modelando dos entidades conectadas por una relación de muchos a muchos y navegable en ambos sentidos:

Diagrama UML de la relación entre Actores y Películas

Así mismo, se utilizará la siguiente información:

Actor Nombre Fecha de nacimiento
Natalie Portman 1981-06-09
Orlando Bloom 1977-01-13
Johnny Depp 1963-06-09
Hugo Weaving 1960-04-04
Christopher Lee 1922-05-27
Película Nombre Año Actores
Star Wars: Episodio II - El ataque de clones 2002 Natalie Portman, Christopher Lee
Los piratas del caribe: La maldición del Perla negra 2003 Orlando Bloom, Johnny Depp
El Señor de los anillos: El regreso del rey 2003 Orlando Bloom, Hugo Weaving, Christopher Lee
V de venganza 2006 Natalie Portman, Hugo Weaving

Instrucciones preliminares

  1. En MySQL crea una base de datos llamada lab8. Crea un nuevo proyecto de Django llamado lab8 y dentro de éste una nueva aplicación llamada pelis. Crea los directorios templates y static dentro del directorio lab8. Crea una plantilla de base llamada base.html que haga referencia a la siguiente hoja de estilos externa, y guarda estos archivos en los directorios correspondientes:

    /* Archivo: estilos.css */
    
    body {
        color: #efd;
        background: #453;
        padding: 0 2em;
        margin: 0;
        font-family: sans-serif;
        font-size: 120%;
    }
    
    h1 {
        padding: 30px 30px;
        background: #675;
        color: #ffa;
        font-size: 150%;
    }
    
    h2 {
        color: #bf8;
        border-top: 1px dotted #fff;
        margin-top: 2em
    }
    
    p {
        margin: 1em 0
    }
    
    a:link {
        color: #fe5;
    }
    
    a:visited {
        color: #fe5;
    }
    
    a:hover {
        color: #fe5;
    }
    
    hr {
        margin: 20px 0px;
        color: #efd;
        background-color: #efd;
        height: 2px;
    }
    
    table {
        border-collapse: collapse;
        border: 1px solid #fff;
        padding: 0px;
        margin-bottom: 10px;
    }
    
    td {
      border: 1px solid #fff;
      padding: 10px;
      text-align: center;
    }
    
    th {
      border: 1px solid #fff;
      padding: 10px;
      color: #ffa;
      background: #675;
    }
    
    footer {
        font-size: 90%;
        color: #ffa;
        text-align: center;
    }
  2. Ajusta los valores de las variables DATABASES, TEMPLATE_DIRS y STATICFILES_DIRS dentro del archivo settings.py. Modifica la variable INSTALLED_APPS ahí mismo para dar de alta la aplicación recién creada y el sitio de administración de Django (remueve el símbolo de comentario):

    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',
        'lab8.pelis',
    )
    
  3. Edita el archivo urls.py. Elimina los comentarios de las líneas resaltadas para definir el URL que permite acceder al sitio de administración de Django:

    from django.conf.urls.defaults import patterns, include, url
    
    # Uncomment the next two lines to enable the admin:
    from django.contrib import admin
    admin.autodiscover()
    
    urlpatterns = patterns('',
        # Examples:
        # url(r'^$', 'lab8.views.home', name='home'),
        # url(r'^lab8/', include('lab8.foo.urls')),
    
        # Uncomment the admin/doc line below to enable admin documentation:
        # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
    
        # Uncomment the next line to enable the admin:
        url(r'^admin/', include(admin.site.urls)),
    )
  4. Define los modelos de la aplicación. Agrega al archivo lab8/pelis/models.py el siguiente código:

    from django.db import models
    
    class Actor(models.Model):
        nombre           = models.CharField(max_length=30)
        fecha_nacimiento = models.DateField()
        
        def __unicode__(self):
            return self.nombre
    
    class Pelicula(models.Model):
        nombre    = models.CharField(max_length=60)
        anio      = models.IntegerField()
        actores   = models.ManyToManyField(Actor, related_name='peliculas')
        
        def __unicode__(self):
            return self.nombre

    Es importante notar que el tipo de campo ManyToManyField permite establecer la relación de muchos a muchos entre los modelos Actor y Película. El argumento related_name es el nombre que el modelo relacionado (Actor en este caso) utilizará para poder navegar hacia el otro lado de la relación.

  5. Registra los modelos para que sean accesibles desde el sitio de administración. Crea un archivo llamado admin.py dentro del directorio lab8/pelis con el siguiente contenido:

    from django.contrib import admin
    from lab8.pelis.models import Actor, Pelicula 
     
    admin.site.register(Actor)
    admin.site.register(Pelicula)
  6. Ejecuta el comando para sincronizar la base de datos. Se te preguntará si deseas definir un superusuario. Teclea yes, y proporciona la información solicitada.

  7. Abre el sitio de administración de Django. Corre el servidor de desarrollo de Django y accede desde tu navegador al siguiente URL: http://localhost:8000/admin/. Captura toda la información de actores y películas que se encuentra al inicio de esta página.

  8. Abre una sesión interactiva de Python:

    python manage.py shell

    Teclea los siguientes comandos para ver como se puede navegar entre los modelos:

    from lab8.pelis.models import Actor, Pelicula
    
    # Obtener el actor con id = 1
    a = Actor.objects.get(id=1)
     
    # Obtener las películas en las que ha actuado
    b = a.peliculas.all()
    
    # Obtener todos los actores que aparecen en su primera película
    c = b[0].actores.all()
    

Problemas

  1. Escribe la vista/plantilla dentro de la aplicación pelis que, dado un cierto año (como parte del URL), despliega el nombre de todas las películas estrenadas durante ese año (utilizando una lista de viñetas de HTML). Por ejemplo, dado el URL http://localhost:8000/pelis/2003/, la salida esperada debe ser:

    Para poder tomar el año a partir del URL, deberás utilizar la siguiente expresión regular dentro del archivo urls.py:

    r'^pelis/(\d{4})/$'

    Esta expresión básicamente reconoce un URL que comienza con /pelis/. La secuencia \d reconoce un dígito decimal, y el {4} indica que se debe repetir cuatro veces. Toda la subexpresión entre paréntesis conforma un "grupo". La subcadena que sea reconocida como parte de ese "grupo" será enviada como argumento adicional a la vista asociada. Por tanto la vista puede definirse así:

    def pelis(request, year):
        # El parámetro year tiene una cadena con cuatro dígitos decimales.
        ...
  2. En la aplicación actual, escribe la vista/plantilla que permita desplegar una tabla de HTML con todos los actores almacenados en la base de datos, ordenados por nombre de manera ascendente. Incluye también su fecha de nacimiento así como los nombres de todas las películas en las que ha actuado. Por ejemplo, dado el URL http://localhost:8000/actores/, la salida debe verse así:

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, Octubre 25.

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.
© 1996-2011 por Ariel Ortiz Ramírez (ariel.ortiz@itesm.mx)
Desarrollado en Django | Licencia de Creative Commons | HTML5 válido | CSS válido