Сегодня я читал, что Django 1.3 alpha является отправкой, а самой популярной новой функцией является представление представлений на основе классов.
Я прочитал соответствующую документацию, но мне трудно увидеть большое преимущество ™, которое я мог бы получить, используя их, поэтому я прошу здесь о помощи в понимая их.
Возьмем расширенный пример из документации.
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
И теперь давайте сравним это с решением "простого старого взгляда", сделанным мной через 5 минут для этого вопроса (извиняюсь за любую ошибку, которую вы можете найти в нем).
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))
Вторая версия для меня выглядит:
- Эквивалент функциональности
- Гораздо более читаемый (
self.args[0]
? awful!) - Более короткие
- Не менее DRY-совместимый
Есть ли что-то большое, что мне не хватает? Почему я должен их использовать? Это документы? Если да, то каков будет идеальный вариант использования? Полезны ли миксины?
Заранее благодарим любого, кто вносит свой вклад!
P.S. для тех, кто мог бы задаться вопросом, я никогда не был увлечен общими представлениями: как только мне понадобилась какая-то расширенная функциональность, они стали не короче обычных представлений.