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.