Ver índice de contenidos del libro

9.2. Vistas genéricas de objetos

La vista genérica direct_to_template ciertamente es útil, pero las vistas genéricas de Django brillan realmente cuando se trata de presentar vistas del contenido de tu base de datos. Ya que es una tarea tan común, Django viene con un puñado de vistas genéricas incluidas que hacen la generación de vistas de listado y detalle de objetos increíblemente fácil.

Demos un vistazo a una de estas vistas genéricas: la vista "object list". Usaremos el objeto Publisher del Capítulo 5:

class Publisher(models.Model):
    name = models.CharField(maxlength=30)
    address = models.CharField(maxlength=50)
    city = models.CharField(maxlength=60)
    state_province = models.CharField(maxlength=30)
    country = models.CharField(maxlength=50)
    website = models.URLField()
 
    def __unicode__(self):
        return self.name
 
    class Meta:
        ordering = ["-name"]
 
    class Admin:
        pass

Para construir una página listado de todos los books, usaremos la URLconf bajo estas líneas:

from django.conf.urls.defaults import *
from django.views.generic import list_detail
from mysite.books.models import Publisher
 
publisher_info = {
    "queryset" : Publisher.objects.all(),
}
 
urlpatterns = patterns('',
    (r'^publishers/$', list_detail.object_list, publisher_info)
)

Ese es todo el código Python que necesitamos escribir. Sin embargo, todavía necesitamos escribir una plantilla. Podríamos decirle explícitamente a la vista object_list que plantilla debe usar incluyendo una clave template_name en el diccionario de argumentos extra, pero en la ausencia de una plantilla explícita Django inferirá una del nombre del objeto. En este caso, la plantilla inferida será "books/publisher_list.html" — la parte "books" proviene del nombre de la aplicación que define el modelo, mientras que la parte "publisher" es sólo la versión en minúsculas del nombre del modelo.

Esta plantilla será renderizada en un contexto que contiene una variable llamada object_list la cual contiene todos los objetos book. Una plantilla muy simple podría verse como la siguiente:

{% extends "base.html" %}
 
{% block content %}
    <h2>Publishers</h2>
    <ul>
        {% for publisher in object_list %}
            <li>{{ publisher.name }}</li>
        {% endfor %}
    </ul>
{% endblock %}

Eso es realmente todo en lo referente al tema. Todas las geniales características de las vistas genéricas provienen de cambiar el diccionario "info" pasado a la vista genérica. El Apéndice D documenta todas las vistas genéricas y todas sus opciones en detalle; el resto de este capítulo considerará algunas de las maneras comunes en que tú puedes personalizar y extender las vistas genéricas.