Ich habe heute gelesen, dass Django 1.3 alpha ausgeliefert wird, und die am meisten angepriesene neue Funktion ist die Einführung klassenbasierter Ansichten .
Ich habe die entsprechende Dokumentation gelesen , aber es fällt mir schwer, den großen Vorteil ™ zu erkennen , den ich durch ihre Verwendung erzielen könnte. Deshalb bitte ich hier um Hilfe beim Verständnis.
Nehmen wir ein erweitertes Beispiel aus der Dokumentation.
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
Und jetzt vergleichen wir es mit einer Lösung, die ich in 5 Minuten für diese Frage erstellt habe (ich entschuldige mich für etwaige Fehler).
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))
Die zweite Version sieht für mich so aus:
- Entspricht der Funktionalität
- Viel besser lesbar (
self.args[0]
? Schrecklich!) - Kürzer
- Nicht weniger DRY-konform
Fehlt mir etwas Großes? Warum sollte ich sie verwenden? Sind die in der Dokumentation? Wenn ja, was wäre dann der ideale Anwendungsfall? Sind Mixins so nützlich?
Vielen Dank im Voraus an alle, die dazu beitragen!
PS für diejenigen, die sich vielleicht fragen, ich war auch nie begeistert von allgemeinen Ansichten: Sobald ich einige erweiterte Funktionen benötigte, wurden sie nicht kürzer als normale Ansichten.