lunes, 10 de mayo de 2010

Nota Django: Intro II. Hello world 2.

Este post es la continuación de Intro django I. Ahora lo que vamos a ver es como poder leer la dirección que se escribe en el navegador y usar esos datos.

Vamos a modificar el archivo urls.py y el archivo views.py para que cuando se escriba la dirección en el navegador, podamos leer los datos introducidos. Es necesario crear una nueva página, por lo que es necesario modificar el archivo urls.py y crear una nueva vista.

Vamos a crear la página http://127.0.0.1:8000/say/xxx. Donde 'xxx' es cualquier combinación de entre uno y veinte caracteres de logitud. Esta página mostrará el texto introducido ('xxx').

Añadimos la nueva vista.

vi views.py

Editamos el archivo para que quede de la siguiente manera.

# Create your views here.
from helloweb.textapp.models import Textmodel
from django.http import HttpResponse


def say_hello(request):
    text = Textmodel.objects.get(pk = 1)
    html = "%s" % text.content
    return HttpResponse(html)
 

def say(request, txt): 
    html = "%s" % txt 
    return HttpResponse(html) 

Ahora vamos a editar el fichero helloweb/urls.py para que se pueda interpretar la nueva dirección.

vi urls.py

Añadimos la nueva dirección a urlpatterns.

from django.conf.urls.defaults import * 
from helloweb.textapp.views import say_hello 
from helloweb.textapp.views import say 

# Uncomment the next two lines to enable the admin: 
# from django.contrib import admin 
# admin.autodiscover() 

urlpatterns = patterns('', 
    # (r'^admin/', include(admin.site.urls)), 
    (r'^hello/$', say_hello), 
    (r'^say/([a-z]{1,20})/$', say) 
) 

La expresión [a-z]{1,20} hace referencia a cualquier cadena de caracteres entre la a y la z (sólo minúsculas) con una longitud de entre 1 y 20 caracteres. Para más información sobre las expresiones regulares (o regexes). Enlace: http://docs.python.org/library/re.html#re-syntax

Una vez modificados los archivos, ejecutamos el servidor de pruebas que trae django.

python manage.py runserver


Ponemos la siguiente dirección en el navegador para comprobar que todo funciona.

http://127.0.0.1:8000/say/hello

El navegador nos debe mostrar el texto 'hello' en el contenido de la página. Podemos cambiar el texto 'hello' en la barra de direcciones por cualquier otro texto de entre uno y veinte caracteres en minúsculas, y esa nueva cadena es la que aparecerá en el contenido de la página.



Plantillas de Django

En el ejemplo anterior, el html se generó directamente con python. Esto no es muy conveniente y que el diseño de la página está empotrada en su programación. Lo adecuado es hacerlo de forma separada. Django tiene un sistema de plantillas (templates) que permite separar la parte de programción en django y la parte de diseño web.

A continuación vamos a modificar la función say, para que en vez de escrbir directamente el html, se extaraiga de una plantilla y los datos que queramos introducir en la página, los proporcione django.

Lo primero que hay que hacer es crear una plantilla. La voy a guardar como helloweb/templates/say_template.html

vi template.html

Añadir el siguiente código html al archivo:

 < html >
    < head >
        < title >Say page!!!< /title >
    < /head >
    < body >

        < h1 >Say page.< /h1 >
        < p >you say: {{ text }}.< /p >
    < /body >
< /html >

He dejado espacio entre las etiquetas html para que se vea correctamente en el blog pero en nuestro ejemplo no hay que dejar espacios entre los caracteres '<', '>' y las etiquetas.

El texto {{ text }} es una variable, y por lo tanto, este texto se reemplazará por un valor durante la ejecución.

A la hora de usar un template en django dentro de un proyecto, es necesario añadir el path donde se encuentra el template al fichero helloweb/settings.py. Las rutas hay que ponerlas de forma absoluta, es decir, partiendo de '/'. A continuación pongo lo que hay que variar en el archivo settings.py para añadir un directorio de templates.

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    '/home/user/djangoprojects/helloweb/templates',
)

Nota: Es importante poner la coma al final de la cadena, ya que es una tupla.

Una vez hecho esto ya se han añadido los templates que estén en ese directorio al proyecto.


A continuación hay que modificar la función say del archivo helloweb/textapp/views.py para leer el template y añadir a dicho template las variables deseadas.


vi views.py

Modificamos la función say e importamos los módulos necesarios. Pongo el fichero views.py entero con las modificaciones necesarias para el uso del template.

# Create your views here.
from helloweb.textapp.models import Textmodel
from django.http import HttpResponse
from django.template.loader import get_template
from django import template

def say_hello(request):
    text = Textmodel.objects.get(pk = 1)
    html = "%s" % text.content
    return HttpResponse(html)

def say(request, txt):
    t = get_template('say_template.html')
    c = template.Context({'text': txt})
    html = t.render(c)
    return HttpResponse(html)

En la funcion say, hemos creado el template 't' a partir de la plantilla 'say_template.html'. Este fichero tiene que estar en el directorio que hemos añadido a settings.py. Después, se ha creado el contexto 'c' que contine el diccionario con la variable 'text', a la cual le daremos el valor de la variable 'txt' durante la ejecución.

Al poner la dirección http://127.0.0.1:8000/say/hello en el navegador, nos mostrará el contenido de la plantilla pero con el valor actual de la variable {{text}}, es decrir 'hello'.

No hay comentarios:

Publicar un comentario