Czytałem dzisiaj, że Django 1.3 alpha jest w sprzedaży, a najbardziej reklamowaną nową funkcją jest wprowadzenie widoków klasowych .
Przeczytałem odpowiednią dokumentację , ale trudno mi dostrzec wielką zaletę, jaką mogę uzyskać dzięki ich stosowaniu, dlatego proszę o pomoc w ich zrozumieniu.
Weźmy zaawansowany przykład z dokumentacji.
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
A teraz porównajmy to z rozwiązaniem „zwykłych starych poglądów”, wykonanym przeze mnie w ciągu 5 minut na to pytanie (przepraszam za każdy błąd, który można w nim znaleźć).
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))
Druga wersja dla mnie wygląda:
- Odpowiednik funkcjonalności
- O wiele bardziej czytelny (
self.args[0]
? Okropny!) - Krótszy
- Nie mniej zgodny z DRY
Czy brakuje mi czegoś dużego? Dlaczego powinienem ich używać? Czy to jest dokumentacja? Jeśli tak, to jaki byłby idealny przypadek użycia? Czy miksy są przydatne?
Z góry dziękuję każdemu, kto wnosi wkład!
PS dla tych, którzy mogą się zastanawiać, nigdy nie fascynowały mnie również widoki ogólne: gdy tylko potrzebowałem jakiejś zaawansowanej funkcjonalności, stały się nie krótsze niż zwykłe widoki.