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.
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.
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
.
lab6
. El laboratorio 2 explica como crear una base de datos.
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', )
Procederemos ahora a crear un modelo, el cual será mapeado a una tabla en la base de datos. El modelo consistirá de:
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
.
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.
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.
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.
Para entregar tu trabajo individual, sigue las siguientes instrucciones:
reporte_lab6_A0MMMMMMM.txt
, en donde A0MMMMMMM
corresponde a tu matrícula. A partir del código fuente de AsciiDoc debes generar el archivo HTML correspondiente. Dicho archivo se debe llamar reporte_lab6_A0MMMMMMM.html
. Coloca ambos archivos dentro del directorio lab6
.
lab6
. Nombra a este archivo lab6.tgz
. Este archivo se puede crear desde la línea de comando tecleando lo siguiente (asegúrate que te encuentres en el mismo nivel que el directorio lab6
):
tar czf lab6.tgz lab6
Fecha límite: Martes, Marzo 6.
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. |