오늘 Django 1.3 알파가 출시되고 있으며 가장 선전 된 새로운 기능은 클래스 기반 뷰 의 도입입니다 . 관련 문서를
읽었 지만 이를 사용하여 얻을 수 있는 큰 이점 ™ 을보기가 어려웠 으므로 여기에서이를 이해하는 데 도움을 요청합니다. 문서에서 고급 예제 를
살펴 보겠습니다 .
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]
? 끔찍합니다!) - 짧게
- 덜 DRY 준수
내가 놓친 큰 것이 있습니까? 왜 사용해야합니까? 그것들이 문서에 있습니까? 그렇다면 이상적인 사용 사례는 무엇입니까? 인가 이나 mixin 유용한 그?
기여해 주신 모든 분들께 미리 감사드립니다!
추신 : 궁금해하는 사람들을 위해, 나는 일반보기에 매료 된 적이 없었습니다. 고급 기능이 필요하자마자 일반보기보다 짧아지지 않았습니다.