El libro de Django 1.0

9.6. Realizar trabajo extra

El último patrón común que veremos involucra realizar algún trabajo extra antes o después de llamar a la vista genérica.

Imagina que tenemos un campo last_accessed en nuestro objeto Author que estuvimos usando para tener un registro de la última vez que alguien vio ese author. La vista genérica object_detail, por supuesto, no sabría nada sobre este campo, pero una vez más fácilmente podríamos escribir una vista personalizada para mantener ese campo actualizado.

Primero, necesitamos agregar una pequeña parte de detalle sobre el author en la URLconf para que apunte a una vista personalizada:

from mysite.books.views import author_detail

urlpatterns = patterns('',
    #...
    (r'^authors/(?P<author_id>\d+)/$', author_detail),
)

Luego escribiremos nuestra función wrapper:

import datetime
from mysite.books.models import Author
from django.views.generic import list_detail
from django.shortcuts import get_object_or_404

def author_detail(request, author_id):
    # Look up the Author (and raise a 404 if she's not found)
    author = get_object_or_404(Author, pk=author_id)

    # Record the last accessed date
    author.last_accessed = datetime.datetime.now()
    author.save()

    # Show the detail page
    return list_detail.object_detail(
        request,
        queryset = Author.objects.all(),
        object_id = author_id,
    )

Nota Este código en realidad no funcionará a menos que agregues un campo last_accessed a tu modelo Author y agregues una plantilla books/author_detail.html.

Podemos usar un método similar para alterar la respuesta devuelta por la vista genérica. Si quisiéramos proporcionar una versión en texto plano que se pueda descargar desde la lista de autores, podríamos usar una vista como esta:

def author_list_plaintext(request):
    response = list_detail.object_list(
        request,
        queryset = Author.objects.all(),
        mimetype = "text/plain",
        template_name = "books/author_list.txt"
    )
    response["Content-Disposition"] = "attachment; filename=authors.txt"
    return response

Esto funciona porque la vista genérica devuelve simplemente objetos HttpResponse que pueden ser tratados como diccionarios para establecer las cabeceras HTTP. Este arreglo de Content-Disposition, por otro lado, instruye al navegador a descargar y guardar la página en vez de mostrarla en pantalla.