Hôm nay tôi đọc được rằng Django 1.3 alpha đang được vận chuyển và tính năng mới được chào hàng nhiều nhất là giới thiệu các chế độ xem dựa trên lớp .
Tôi đã đọc các tài liệu liên quan , nhưng tôi cảm thấy khó thấy được lợi thế lớn mà tôi có thể nhận được khi sử dụng chúng, vì vậy tôi đang yêu cầu ở đây để được trợ giúp trong việc hiểu chúng.
Hãy lấy một ví dụ nâng cao từ tài liệu.
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
Và bây giờ chúng ta hãy so sánh nó với một giải pháp "quan điểm đơn giản", do chính tôi thực hiện trong 5 phút cho câu hỏi này (tôi xin lỗi vì bất kỳ lỗi nào bạn có thể tìm thấy trong đó).
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))
Phiên bản thứ hai đối với tôi trông:
- Tương đương về chức năng
- Có thể đọc được nhiều hơn (
self.args[0]
? Kinh khủng!) - Ngắn hơn
- Không ít tuân thủ DRY
Có điều gì lớn mà tôi đang thiếu? Tại sao tôi nên sử dụng chúng? Những cái đó có trong tài liệu không? Nếu vậy thì trường hợp sử dụng lý tưởng sẽ là gì? Là mixins rằng hữu ích?
Cảm ơn trước cho bất kỳ ai đóng góp!
PS cho những ai có thể thắc mắc, tôi cũng không bao giờ bị say mê bởi các chế độ xem chung chung: ngay khi tôi cần một số chức năng nâng cao, chúng trở nên không ngắn hơn các chế độ xem thông thường.