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&aacute;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&oacute;n tiene
</font><font color=green> {{cuantosinformaticoshay}}
</font><font color=blue>inform&aacute;ticos en
total</font></center></h3><br>

<h3><center><font color=’red’>Estos son los 3 &uacute;ltimos
inform&aacute;ticos inscritos</center></font></h3>
{% if informaticos %}
<table><tr align=”center”>
<center>
{% for Informatico in informaticos %}
<h5><td>
<div class=’entry’><b>{{Informatico.nombre}}&nbsp</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&iacute;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&oacute;n: <font color=black>{{Informatico.inscri}}</b></div>
</h5></td>
</center>
{% endfor %}
</tr>

</table></center>

{% else %}
<p>No hay inform&aacute;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

Responder a