martes, 11 de mayo de 2010

Nota Django. Crear una página de comentarios

Este post es la continuación de otros post que he realizado sobre el framework Django. En este post voy a poner un pequeño ejemplo de como se haría una página de comentarios. Creo que es bastante ilustrativo porque toca temas importantes de django. Maneja la base de datos (SQLite3 en nuestro ejemplo) a través de los modelos de django, se usan plantillas (template) con el gestor de plantillas de django, se genera una página a partir de plantillas en las cual se escriben registros almacenados en la base de datos y se leen datos de un formulario que incluye esa misma página.

Lo primero que hay que hacer es crear el proyecto de django.

django-admin startproject commentweb


Creamos una app que va a tener el modelo que gestiona los comentarios que se almacenan en la base de datos.

python manage.py startapp comments


Añadimos el modelo dentro de commentweb/commments/models.py.


from django.db import models
# Create your models here.
class Comment(models.Model):
    title = models.CharField(max_length = 20)
    date = models.DateTimeField()
    text = models.TextField(blank = True)

El modelo consta de tres campos:

  • title: título del comentario.
  • date: fecha de la publicación.
  • text: contenido del comentario.


Ahora hay que modificar el archivo settings.py

Base de datos

DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'comments.sqlite'             # Or path to database file if using sqlite3.
DATABASE_USER = ''             # Not used with sqlite3.
DATABASE_PASSWORD = ''         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.

Zona horaria. Se puede consultar en http://en.wikipedia.org/wiki/List_of_tz_zones_by_name

TIME_ZONE = 'Europe/Madrid'

Añadimos el path donde se almacenan los 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/commentweb/templates",
)


Aplicaciones disponibles. He borrado las que vienen por defecto y he añadido la que hemos creado.

INSTALLED_APPS = (
    'commentweb.comments',
)

A continuación sincronizamos la base de datos.

python manage.py syncdb


Nos inidica que hemos creado una nueva tabla

Nuestra página web va a tener dos direcciones, por lo tanto debemos editar el fichero commentweb/urls.py para añadirlas.


from django.conf.urls.defaults import *
from commentweb.comments.views import save
from commentweb.comments.views import comments

urlpatterns = patterns('',
    (r'^comments/$', comments),
    (r'^save/$', save)
)

Vamos a crear las páginas '/comments/' y '/save/'. La página '/comments/' mostrará los comentarios que hay almacenados en la base de datos. Además, tendrá un formulario que nos permita añadir nuevos comentarios. La página '/save/' almacena un comentario nuevo. Esta página se llama desde el formulario de la página anterior cuando se añade un nuevo comentario. Para gestionar estas páginas hay que crear las funciones comments y save en commentweb/comments/views.py. Pero antes, vamos a crear los templates que usan dichas funciones. En el directorio que hemos añadido anteriormente al archivo settings.py, vamos a crear el template comments.html. A continuación muestro su contenido:

< html>
    < head>
        < title>Comments< /title>
    < /head>
    < body>
        < form method="post" action="/save/">
            Title< input type="text" size="20" maxlength="20" name="title"> < br />
            < textarea name="text" rows="4" cols="40">< /textarea>< br/>
            < input type="submit" value="Comment!"/>
        < /form>
        {% for comment in comment_list %}
            < h2>{{comment.title}}< /h2>
            < p>Date: {{comment.date}}< /p>
            < p>{{comment.text}}< /p>
        {% endfor %}
    < /body>
< /html>

Nota: he dejado un espacio entre los caracteres '<' y la etiquetas para una correcta visualización en el blog. Cuando se use este fichero hay que eliminar dichos espacios.

La plantilla anterior tiene dos partes fundamentales. La primera, es un formulario que permite añadir comentarios. De este formulario es importante el nombre del textarea (name="text"), el nombre de título (name="title") y que la acción que se ejecuta al pulsar el botón "Comment!" (action="/save/") nos lleva a la página '/save/'. La segunda, es una etiqueta de plantilla for que nos muestra todos los comentarios que están almacenados en la variable comment_list. A continuación se muestra el template para la página save.html


< html>

    < head> 

        < meta http-equiv="Refresh" content="2;url=../comments/"> 

    < /head>



    < body>

        < p>Su comentario ha sido guardado. 
Por favor esperar a ser redireccionado.< /p>

    < /body>

< /html>


Nota: he dejado un espacio entre los caracteres '<' y la etiquetas para una correcta visualización en el blog. Cuando se use este fichero hay que eliminar dichos espacios. Esta plantilla es muy simple. Nos muestra un mensaje diciendo que el comentario de ha guardado y pasado 2 segundos nos redirecciona otra vez a la página comments. El proceso en el que se guarda el comentario en la base de datos se realiza en la función que invoca este template desde la vista. A continuación, vamos a ver las funciones que generan las vistas.

from commentweb.comments.models import Comment

from django.shortcuts import render_to_response

import datetime



# Create your views here.

def comments(request):

    comment_list = Comment.objects.all()

    return render_to_response('comments.html', {'comment_list': comment_list})



def save(request):

    txt = request.POST["text"]

    title = request.POST["title"]

    comment = Comment()

    comment.text = txt

    comment.date = datetime.datetime.now()

    comment.title = title

    comment.save()

    return render_to_response('save.html', None)



La funcion comment obtiente una lista de todos los comentarios que hay en la base de datos. Esta función retorna la salida de la función render_to_response que tiene dos parametros de entrada. El primero es el template con el que se crea la página. El segundo, es un diccionario que contiene los valores de las variables que hay en las plantillas. La clave del diccionario es una cadena que corresponde al nombre de la variable que usa el template ({{comment_list}} en este caso) y valor del diccionario, es el valor que la variable va a tomar durante la ejecución.


Una vez realizado esto, nuestro ejemplo ya está terminado. Para poder comprobar su funcionamiento es necesario ejecutar el servidor de pruebas que trae django.

python manage.py runserver

la dirección de nuestra nueva página es:

http://127.0.0.1:8000/comments/

Una vez realizado todos los pasos anteriores, nuestra nueva página ya nos debería permitir introducir nuevos comentarios.

1 comentario:

  1. mejora este ejemplo cambiando el orden en que aparecen los comentarios. Ordenalos por fecha de manera inversa:

    "comment_list = Comment.objects.order_by("-date")"

    ResponderEliminar