martes, 28 de octubre de 2014

Escribiendo views que hacen algo

Cada view es responsable de hacer una de dos cosas: devolver un objeto HttpResponse con el contenido de la página solicitada, o levantar una excepción, por ejemplo Http404. El resto depende de uno.
Una view puede leer registros de una base de datos, o no. Puede usar un sistema de templates como el de Django – o algún otro basado en Python –, o no. Puede generar un archivo PDF, una salida XML, crear un archivo ZIP, cualquier cosa que uno quiera, usando cualquier librería Python que uno quiera.
Todo lo que Django espera es un HttpResponse. O una excepción.
Por ser conveniente, vamos a usar la API de Django para base de datos, que vimos en el Tutorial 1. Aquí tenemos una aproximación a la view index() que muestra las 5 encuestas más recientes en el sistema, separadas por comas, de acuerdo a la fecha de publicación:

from django.http import HttpResponse

from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
    output = ', '.join([p.question for p in latest_poll_list])
    return HttpResponse(output)

Pero tenemos un problema: el diseño de la página está escrito explícitamente en la view. Si uno quisiera cambiar cómo se ve la página, debería editar el código Python. Entonces vamos a usar el sistema de templates de Django para separar el diseño del código Python.

Primero, creamos un directorio polls en el directorio de templates especificado en setting:TEMPLATE_DIRS. Allí creamos un archivo llamado index.html. En ese template escribimos el siguiente código:

from django.http import HttpResponse
from django.template import Context, loader

from polls.models import Poll

def index(request):
    latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
    template = loader.get_template('polls/index.html')
    context = Context({
        'latest_poll_list': latest_poll_list,
    })
    return HttpResponse(template.render(context))

No hay comentarios:

Publicar un comentario