Vistas Basadas en Clases
Cuando Django se actualizó a la versión 1.5, reescribí las vistas del blog1 para pasarlas al tipo CBV (Class Based Views) o Vistas Basadas en Clases, por lo menos las que generaban listas (archivo; por día, mes y año; por categoría y por etiqueta) y la de entradas individuales.
Las CBV son geniales porque simplifican la forma en que operamos nuestro código, por ejemplo, la siguiente es la CBV para las entradas individuales.
class EntradaIndividual(DateDetailView):
date_field ="pub_date"
model = Entry
slug_field = 'slug'
template_name = 'blog/single.html'
Pero hay muchas CBV genéricas y conviene que las conozcas todas, por lo que a continuación encontrarás una lista. Recuerda que todas pertenecen a django.views.generic
y debes incluir ese namespace al importarlas.
Nombre | Descripción | Ejemplo de Uso |
---|---|---|
View |
Base genérica que puede usarse para todo | Página de archivo |
RedirectView |
Redirecciona al visitante a otra página | Un acortador de direcciones |
TemplateView |
Muestra una plantilla | Una página estática, como ‘politicas.html’ |
ListView |
Lista de objetos en un queryset |
Una página de categorías |
DetailView |
Muestra un objeto | Un artículo individual |
FormView |
Clase para enviar formularios | Un formulario de contacto |
CreateView |
Crea un objeto | Formulario para crear un artículo |
UpdateView |
Actualiza un objeto | Actualizar un artículo en el blog |
DeleteView |
Borra un objeto | Borrar un registro en la base de datos |
Vistas genéricas basadas en fechas | Para mostrar artículos basados en fecha | En un blog basado en fechas |
La portada de este blog usa una ListView
muy simple pero a la vez muy poderosa, porque con solo tres líneas son necesarias para crear la portada con todo y paginación:
class BlogArchivo(ListView):
queryset = Entry.objects.order_by('-pub_date', 'id')
paginate_by = 6
template_name = 'portada.html'
Por otro lado, las categorías también utilizan esta vista ListView
pero algo más compleja, porque utilizan una variable para generar el queryset
:
class CategoriaList(ListView):
paginate_by = 5
template_name = "categoria.html"
make_object_list = True
context_object_name = 'categoria_list'
def get_queryset(self):
self.cat = get_object_or_404(Categoria, slug=self.args[0])
return Entry.objects.filter(category=self.cat).order_by('-pub_date', 'id')
def get_context_data(self, **kwargs):
context = super(CategoriaList, self).get_context_data(**kwargs)
context['cat'] = self.cat
return context
En artículos posteriores veremos en detalle cada una de estas clases.
-
En ese tiempo el blog era ConxB, que ya no está operativo. Nada está perdido, namespace.mx recibirá todo el contenido del blog anterior. ↩