Hace ya bastante tiempo (cuando la versión 0.95), probé la mano con Django y me pareció muy bueno. Luego por alguna razón (en realidad, porque acá todo se vuelve PHP+PostgreSQL y no hay tiempo para nada) le perdí el paso y no me fue fácil adaptarme a los cambios que traía cada nueva versión. Pero bueno, decidí que ya era hora de refrescar esa experiencia, y me puse a preparar algo sencillo, para el eterno principiante que siempre voy a ser.
Lo pongo para si le ayuda en algo a alguien. Y porque en su momento a Alí se le ocurrió preguntarme si pudiera ayudarlo en un eventual taller, y descubrí que casi todo se me había olvidado... Manos a la obra! Lo primero, según me dicen, es crear un proyecto; llamémosle partagas. Me muevo hacia /usr/share/pyshared/django/conf y allí tecleo: django-admin startproject partagas Esto creará el espacio y los ficheros para el proyecto partagas. Vamos a comprobar lo que tenemos. Django pone por defecto un servidor web para pruebas, que se lanza mediante: python manage.py runserver poniéndolo a escuchar por el puerto 8000 de forma implícita. comprobemos esto abriendo un navegador y pidiendo: http://localhost:8000 Todo está en orden, entonces. Declaremos ahora que en ese proyecto habrá una aplicación llamada uic. Voy a tomar como ejemplo una supuesta aplicación para manejar los datos de los miembros de la Unión de Informáticos de Cuba: python manage.py startapp uic Esto crea para la aplicación una estructura de directorio, con algunos ficheros ya semielaborados. Vamos ahora a preparar condiciones.En settings.py aparecerán las indicaciones generales sobre el proyecto que vamos a desarrollar. Declaremos allí cómo lo queremos: me declaro en la línea admins con mi nombre y dirección de correo en la opción DATABASES añado django.db.backends.postgresl_psycopg2y (porque voy a usar PostgreSQL como sistema de base de datos) en name pongo uic en user pongo admin en password pongo admin (por ahora, esto es probando!) en host pondré el FQDN de mi equipo en time/zone pongo America/Havana en language_code pongo es en media_root pongo /srv/media/ (un directorio que luego crearé) en admin_media_prefix pongo /fotos/ (un directorio que luego crearé dentro de /srv/media/) el secret_key debería cambiarlo asegurarme de que root_urlconf diga partagas.urls en installed_apps descomentar las líneas que activan la interfaz de administración y la documentación de administración En el fichero urls.py también debo descomentar las líneas que activan dirigir a la interfaz de administración y a la de documentación de administración. Si todo va bien, ahora levantando el servidor de pruebas y apuntando el navegador a http://localhost:8000/admin debería poder ver la interfaz de administración y tener una idea de cómo luce. Es tiempo de hacer un alto, prepararnos un café y pensar en los siguientes pasos. Lo primero será leer con cuidado la documentación que trae Django en html (writing your first Django app) apara captar la idea. Y de paso copiar alguna que otra declaración que habremos de poner en nuestro código. Django separa tres paradigmas en la programación: la estructura de la base de datos (models.py), cómo se apunta a ellos (urls.py) y cómo se presentará (views.py). Ello permite, en teoría (y también en la práctica) tener tres equipos trabajando a la vez, cada uno en una tarea distinta y haciendo avanzar un proyecto de software. Pero como estamos solos, pues habremos de acometer las tareas cada una en su momento. Hasta que convenzamos a alguien más… Ocupémonos primero de lo que es necesario para models.py. Vamos a crear una base de datos de PostgreSQL (por ejemplo, usando PgAdmin3) llamada uic.Vayamos a settings.py y allí, en las declaraciones de installed_apps añadamos ‘partagas.uic’, al final, dentro del paréntesis. (a estas horas ya se estará preguntando por qué esos nombres con puntos intercalados. Bien, es la forma en que Python denota los subdirectorios). Ahora hay que ejecutar (desde /usr/share/pyshared/django/conf) algunos comandos para asegurar que Django cree algunas tablas auxiliares que necesitará: python manage.py syncdb python manage.py validate (para validar si todo está OK) python manage.py sqlall uic Crearé una tabla informatico con los campos siguientes: nombre character varying (129) NOT NULL email character varying (75) NOT NULL foto character varying (100) NOT NULL provincia character varying (3) NOT NULL curriculum text titulo character(3) NOT NULL intereses text paistitulo character (2) anograduado integer inscri date Ejecutemos de nuevo los tres comandos mágicos para actualizar y sincronizar todo esto: python manage.py syncdb python manage.py validate (para validar si todo está OK) python manage.py sqlall uic Ocupémonos ahora (esto que viene es más complicado) de cómo extraer y visualizar la información. Vamos al directorio uic (creado por Django) y allí ponemos esto en models.py: # -*- coding: UTF-8 -*- from django.contrib import admin from django.db import models from django.db.models.fields import * from django_countries import CountryField # Create your models here. class Informatico(models.Model): PROVINCIA_CHOICES = ((‘PRI’,’Pinar del Río’),(‘ART’,’Artemisa’), (‘HAB’,’La Habana’),(‘MAY’,’Mayabeque’),(‘MAT’,’Matanzas’),(‘VC’,’Villa Clara’), (‘CFG’,’Cienfuegos’),(‘SS’,’Sancti Spirítus’),(‘CA’,’Ciego de Ávila’),(‘CMG’,’Camaguey’), (‘LT’,’Las Tunas’),(‘HLG’,’Holguín’),(‘GRM’,’Granma’),(‘SC’,’Santiago de Cuba’), (‘GTM’,’Guantánamo’),(‘IJ’,’Isla de la Juventud’), ) TITULO_CHOICES = ((‘Dr’,’Doctor’),(‘MSc’,’Máster’),(‘Lic’,’Licenciado’),(‘Tec’,’Técnico de Nivel Medio’), (‘Ing’,’Ingeniero’), (‘Aut’,’Autodidacta’), ) ANOGRADUADO_CHOICES = ((2000,’2000′),(2001,’2001′),(2002,’2002′),(2003,’2003′),(2004,’2004′),(2005,’2005′),(2006,’2006′),(2007,’2007′), (2008,’2008′),(2009,’2009′),(2010,’2010′),(2011,’2011′),(2012,’2012′),(2013,’2013′),(2014,’2014′),(2015,’2015′),(2016,’2016′), ) nombre = models.CharField(max_length=120, db_index=True,help_text=’Primero los apellidos, una coma y luego los nombres’) provincia = models.CharField(max_length=3, choices=PROVINCIA_CHOICES,default=’CHA’) titulo = models.CharField(max_length=3,choices=TITULO_CHOICES,default=’Lic’,help_text=’Despliegue la lista y escoja’) anograduado = models.IntegerField(choices=ANOGRADUADO_CHOICES,default=’0000′,help_text=’Despliegue la lista y escoja’) paistitulo = CountryField() inscri = DateField() email= models.EmailField() curriculum = models.TextField() intereses = models.TextField() foto = models.ImageField(upload_to=”fotos”, help_text=’Foto del informatico que va a subir al sitio’) def __unicode__(self): return self.nombre class InformaticoAdmin(admin.ModelAdmin): Bueno, es complicado pero no tanto. las primeras líneas mandan importar algunos módulos que necesitaremos. La provincia de residencia del informático la tendremos en un menú desplegable. Ídem para el título y el año de graduado. Las demás cosas se explican por sí solas, más o menos. Si todo va bien, invocando la interfaz de administración mediante http://localhost:8000/admin podré ver de forma cómoda la estructura de mi bae de datos. Aprovechemos para entrar los datos de algunos informáticos; así tendremos algo que mostrar cuando tengamos todo el tinglado armado. Por cierto, esta es la ventaja de separar los tres paradigmas: en una tarde puedo crear la base y la interfaz de administración (que permite dar permisos para tareas específicas) y ya ir poniendo a una secretaria a entrar datos, mientras pensamos cómo vamos a presentarlos después. Claro, quienes tengan secretaria… Importante! Las fotos de los informáticos se subirán a un directorio (con los permisos adecuados) que hube de crear al efecto (véase settings.py). En mi caso, lo usé para todas las imágenes y lo creé en /srv/media/fotos. Puse un symlink desde allí a /var/www, pues no tenía tiempo para ponerme a recordar cómo se declara que /srv se usará para albergar información relacionada con páginas web. Vamos ahora a pensar qué hemos de poner en views.py: # Create your views here. from django.shortcuts import get_object_or_404,render_to_response from partagas.uic.models import Informatico from django.http import HttpResponseRedirect from django.db import models def index(request): informaticos=Informatico.objects.all().order_by(‘inscri’)[:3] cuantosinformaticoshay=Informatico.objects.count() return render_to_response(‘uic/index.html’,{‘informaticos’:informaticos,’cuantosinformaticoshay’:cuantosinformaticoshay}) # Con ello mostrara siempre las ultimas 3 inscripciones A ver: para saber qué módulos hay que importar, es conveniente repasar otra vez la documentación de Django. Nótese que se debe importar el modelo Informatico que se declaró en la aplicación uic del proyecto partagas. Más abajo, donde dice def index(request): esto define cómo se extrae la información de la base PostgreSQL. La variable informaticos lee todos los objetos correspondientes as Informatico ordenados según la fecha de inscripción, y de ellos se quedará con solo los últimos tres (si quisiera ordenar en orden inverso, pondría (‘-inscri’). El [:3] declara que quiero obtener solo 3 de ellos. El render_to_response almacena los resultados de la búsqueda en las variables adecuadas (que serán visualizadas en la página index.html de la aplicación uic). Ahora nos ocuparemos de urls.py, que decide cuál será la página html que habremos de presentar en dependencia del URL solicitado (por ejemplo, http://localhost:8000/uic). le pondremos dentro algo como esto: from django.conf.urls.defaults import * from django.views.generic import * #Puesto por mi from django.views.generic import list_detail,date_based,create_update from partagas.uic.models import Informatico informatico_list_info={ ‘queryset’:Informatico.objects.all(), ‘allow_empty’: True, }# porque el modelo se llama Informatico! urlpatterns = patterns(”, (r’^$’,’partagas.uic.views.index’), ) Toda esta palabrería lo que significa es que si solicito http://localhost:8000/uic en mi navegador se invocará la vista definida como index y se recogerá la información asociada a la consulta que ella hace. Ya estamos casi terminando. solo nos falta poner el código de la página HTML que presentará los datos. Creemos dentro del directorio otro llamado misplantillas (para poner allí ordenadas todas las paginas HTML que correspondan al proyecto partagas) y dentro de misplantillas otro subdirectorio, llamado uic, para alojar las páginas HTML relacionadas específicamente con la aplicación uic. Por el momento escribiremos solamente el código de index.html. Helo aquí: <html> <head> <link rel=”shortcut icon” href=”http://desarrollo.ettpartagas.co.cu/fotos/uic.png” type=”image/x-icon”> <link href=”http://localhost/fotos/style/style.css” rel=”stylesheet” type=”text/css”> </head> <body><table align=center> <tr><td> <img src=”http://desarrollo.ettpartagas.co.cu/fotos/CUBANFLAGBONITA.GIF” border=”no”></td> <td ><h2>Bienvenido al Registro de Informáticos de la UIC</h2></td> <td> <b><font face=”Arial, Helvetica, sans-serif” size=”1″><script language=”JavaScript1.2″> var mydate=new Date() var year=mydate.getYear() if (year<2000) year=year-100 if (year >2010) year=”20″+year if (year<2010) year=”20″+year var day=mydate.getDay() var month=mydate.getMonth() var daym=mydate.getDate() if (daym<10) daym=”0″+daym var dayarray=new Array(“Domingo”,”Lunes”,”Martes”,”Miercoles”,”Jueves”,”Viernes”,”Sabado”) var montharray=new Array(“Enero”,”Febrero”,”Marzo”,”Abril”,”Mayo”,”Junio”,”Julio”,”Agosto”,”Septiembre”,”Octubre”,”Noviembre”,”Diciembre”) document.write(“<small><font color=’green’ face=’Arial’><b>Hoy es “+dayarray[day]+”, “+daym+” de “+montharray[month]+” de “+year +”</b></font></small>”) </script> </font></b> </td> </tr></table> <h3><center><font color=blue>Nuestra asociación tiene </font><font color=green> {{cuantosinformaticoshay}} </font><font color=blue>informáticos en total</font></center></h3><br> <h3><center><font color=’red’>Estos son los 3 últimos informáticos inscritos</center></font></h3> {% if informaticos %} <table><tr align=”center”> <center> {% for Informatico in informaticos %} <h5><td> <div class=’entry’><b>{{Informatico.nombre}} </b></div> <div class=’entry_detail’><img src=”http://desarrollo.ettpartagas.co.cu/{{Informatico.foto}}” height=”10%” width=”10%”></div> <div class=’entry_detail’><b><font color=green>Título: </font><font color=dodgerblue>{{Informatico.titulo}}</font></b></div> <div class=’entry_detail’><b><font color=green>Provincia: <font color=black>{{Informatico.provincia}}</b></div> <div class=’entry_detail’><b><font color=green>E-mail: <font color=black>{{Informatico.email}}</b></div> <div class=’entry_detail’><b><font color=green>Fecha de inscripción: <font color=black>{{Informatico.inscri}}</b></div> </h5></td> </center> {% endfor %} </tr> </table></center> {% else %} <p>No hay informáticos inscritos</p> {% endif %} <center class=”parrafo2″><font color=’red’>© LocosSoft 2016</center></font> </body> </html> Bueno, esto es HTML duro y puro. Los lugares donde queremos mostrar la información extraída de la base de datos los especifico con doble llave; por ejemplo, {{Informatico.nombre}}. Y basta. En otro momento vemos cómo se acopla esto con apache, Nginx o lo que sea. -- M.Sc. Alberto García Fumero Usuario Linux 97 138, registrado 10/12/1998 http://interese.cubava.cu Una conclusión es el punto en que usted se cansó de pensar. ______________________________________________________________________ Lista de correos del Grupo de Usuarios de Tecnologías Libres de Cuba. Gutl-l@jovenclub.cu https://listas.jovenclub.cu/cgi-bin/mailman/listinfo/gutl-l