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.