Leí hoy que Django 1.3 alpha está disponible, y la nueva característica más promocionada es la introducción de vistas basadas en clases .
He leído la documentación pertinente , pero me resulta difícil ver la gran ventaja ™ que podría obtener al usarlos, por lo que solicito ayuda para comprenderlos.
Tomemos un ejemplo avanzado de la documentación.
urls.py
from books.views import PublisherBookListView
urlpatterns = patterns('',
(r'^books/(\w+)/$', PublisherBookListView.as_view()),
)
views.py
from django.shortcuts import get_object_or_404
from django.views.generic import ListView
from books.models import Book, Publisher
class PublisherBookListView(ListView):
context_object_name = "book_list"
template_name = "books/books_by_publisher.html",
def get_queryset(self):
self.publisher = get_object_or_404(Publisher, name__iexact=self.args[0])
return Book.objects.filter(publisher=self.publisher)
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(PublisherBookListView, self).get_context_data(**kwargs)
# Add in the publisher
context['publisher'] = self.publisher
return context
Y ahora comparémoslo con una solución de "vistas simples y antiguas", hecha por mí mismo en 5 minutos para esta pregunta (me disculpo por cualquier error que pueda encontrar).
urls.py
urlpatterns = patterns('books.views',
url(r'^books/(\w+)/$', 'publisher_books_list', name="publisher_books_list"),
)
views.py
from django.shortcuts import get_object_or_404
from books.models import Book, Publisher
def publisher_books_list(request, publisher_name):
publisher = get_object_or_404(Publisher, name__iexact=publisher_name)
book_list = Book.objects.filter(publisher=publisher)
return render_to_response('books/books_by_publisher.html', {
"book_list": book_list,
"publisher": publisher,
}, context_instance=RequestContext(request))
La segunda versión para mí parece:
- Equivalente en funcionalidad
- Mucho más legible (
self.args[0]
¡horrible!) - Corta
- No menos compatible con DRY
¿Hay algo grande que me esté perdiendo? ¿Por qué debería usarlos? ¿Están en la documentación? Si es así, ¿cuál sería el caso de uso ideal? ¿Son los mixins tan útiles?
¡Gracias de antemano a todos los que contribuyen!
PD: para aquellos que se lo pregunten, nunca me cautivaron las vistas genéricas: tan pronto como necesité alguna funcionalidad avanzada, no se volvieron más cortas que las vistas normales.