Ver índice de contenidos del libro

9.1. Usar vistas genéricas

Todas estas vistas se usan creando diccionarios de configuración en tus archivos URLconf y pasando estos diccionarios como el tercer miembro de la tupla URLconf para un patrón dado.

Por ejemplo, ésta es una URLconf simple que podrías usar para presentar una página estática "about" (acerca de):

from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template
 
urlpatterns = patterns('',
    ('^about/$', direct_to_template, {
        'template': 'about.html'
    })
)

Aunque esto podría verse un poco "mágico" a primera vista — ¡mira, una vista sin código! —, es en realidad exactamente lo mismo que los ejemplos en el Capítulo 8: la vista direct_to_template simplemente toma información del diccionario de parámetros extra y usa esa información cuando renderiza la vista.

Ya que esta vista genérica — y todas las otras — es una función de vista regular como cualquier otra, podemos reusarla dentro de nuestras propias vistas. Como ejemplo, extendamos nuestro ejemplo "about" para mapear URLs de la forma /about/<cualquiercosa>/ para renderizar estáticamente /about/<cualquiercosa>.html. Haremos esto primero modificando la URLconf para que apunte a una función de vista:

from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template
from mysite.books.views import about_pages
 
urlpatterns = patterns('',
    ('^about/$', direct_to_template, {
        'template': 'about.html'
    }),
    ('^about/(\w+)/$', about_pages),
)

A continuación, escribimos la vista about_pages:

from django.http import Http404
from django.template import TemplateDoesNotExist
from django.views.generic.simple import direct_to_template
 
def about_pages(request, page):
    try:
        return direct_to_template(request, template="about/%s.html" % page)
    except TemplateDoesNotExist:
        raise Http404()

Aquí estamos tratando direct_to_template como cualquier otra función. Ya que esta devuelve una HttpResponse, podemos retornarlo así como está. La única ligera dificultad aquí es ocuparse de las plantillas perdidas. No queremos que una plantilla inexistente cause un error de servidor, por lo tanto atrapamos las excepciones TemplateDoesNotExist y en su lugar devolvemos errores 404.