SORU
6 Aralık 2010, PAZARTESİ


Sınıf Tabanlı bir avantajı görüş nedir?

Django 1.3 alfa nakliye ve en yeni lanse özelliği class-based views giriş olduğunu okudum bugün.
relevant documentation, okudum ama görmek zorbüyük avantaj sağlaronları kullanarak alabilir miyim, işte onları anlamakta biraz yardım istiyorum.
Hadi belgelerine advanced example.

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

Ve şimdi bunu karşılaştırmak için bir “düz-eski görüntüler” bu soru (Ben bunu bulmak herhangi bir hata için özür dileriz) 5 dakika içinde çözüm, tek başıma yaptım.

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))

Görünüyor: bana ikinci versiyonu

  • Bir işleve eşdeğer
  • Çok daha okunabilir (self.args[0]? korkunç!)
  • Daha kısa
  • Az KURU uyumlu değil

Ben bir şey eksik büyük var mı? Onları neden kullanmalıyım? Bu belgeleri bulunur? Sonra ideal kullanma durumu ne olurdu?mixinsbu işe yarar mı?

Katkısı olan herkese şimdiden teşekkürler!

S. S.asla genel görüş tarafından büyülenmiş gibi olduğumu merak edebilirsiniz olanlar için: bazı gelişmiş işlevler için gerekli en kısa sürede, düzenli görünümleri daha kısa oldu.

CEVAP
7 Aralık 2010, Salı


Bir sınıf alt sınıf ve özel durumlar için get_context_data gibi yöntemlerle rafine, ve geri kalanı olduğu gibi bırakabilirsiniz. Fonksiyonları ile bunu yapamazsın.

Örneğin, bir önceki yaptığı her işi yapan yeni bir görünüm oluşturmak gerekebilir, ama bu bağlamda ekstra değişken eklemek gerekir. Özgün görünümü alt ve get_context_data yöntemini geçersiz kılar.

Ayrıca, bu adımları ayrı yöntemlerde şablonu oluşturmak için ihtiyaç duyulan ayıran net kod teşvik - daha az yapılan bir yöntem, anlamak daha kolay olur. Normal görünüm özellikleri ile, tek bir işlem birimi içine atılmış.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Michael Neal

    Michael Neal

    2 Mayıs 2009
  • PhoneArena

    PhoneArena

    7 NİSAN 2006
  • TheFlashCentre

    TheFlashCent

    22 Mayıs 2008