Bugün Django 1.3 alpha'nın gönderildiğini ve en çok lanse edilen yeni özelliğin sınıf tabanlı görünümlerin tanıtılması olduğunu okudum . İlgili belgeleri
okudum , ancak onları kullanarak elde edebileceğim büyük avantajı ™ görmekte zorlanıyorum , bu yüzden burada onları anlamak için biraz yardım istiyorum. Dokümantasyondan gelişmiş bir örnek
alalım .
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
Şimdi de bunu, bu soru için 5 dakika içinde kendi başıma yaptığım bir "sade eski görünüm" çözümüyle karşılaştıralım (içinde bulabileceğiniz herhangi bir hata için özür dilerim).
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))
Bana göre ikinci versiyon:
- İşlevsellik açısından eşdeğer
- Çok daha okunaklı (
self.args[0]
? Korkunç!) - Daha kısa
- Daha az KURU uyumlu değil
Kaçırdığım büyük bir şey mi var? Neden kullanmalıyım? Belgelerdekiler mi? Öyleyse ideal kullanım durumu ne olurdu? Are Katmalar yararlı mı?
Katkıda bulunan herkese şimdiden teşekkürler!
PS merak edebilirsiniz olanlar için, ben de jenerik görünümleri tarafından büyülenmiş asla: en kısa zamanda bazı gelişmiş işlevsellik gerektiği gibi, düzenli görünümleri daha kısa hale geldi.