2012-08-26 24 views
5

ListView'den devralan bir görünüm yazıyorum ve görünümü giriş yapmış kullanıcılarla kısıtlamaya çalışıyorum.Sınıf tabanlı görünümler dekorasyon iki yöntem arasındaki fark nedir?

https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-in-urlconf, URLconf dosyasında login_required öğesiyle dekorasyon yapıldığını "dekoratörün her bir örnek temelinde uygulanmasını sağlar. Bir görünümün her bir örneğini dekore etmek isterseniz, farklı bir yaklaşım uygulamanız gerekir" -bu yaklaşımın dekore edilmesi görünüm kodunda gönderme yöntemi.

Bir sınıf ve bir örnek arasındaki farkı bildiğimi sanmıştım ama bu ifade benim için bir anlam ifade etmiyor. Birisi açıklayabilir mi? Sınıf tanımınıza ters olarak URLconf'da bir dekoratör olmanın yanı sıra, iki yaklaşım arasındaki farklar nelerdir?

Bu bağlantının üzerindeki paragraf şu soruyu yanıtlıyor gibi görünüyor: "Sınıf tabanlı görünümler işlevler olmadığından, onları dekore etmek, as_view veya bir alt sınıf oluşturuyor olmanıza bağlı olarak farklı çalışır."

Gerçekten mi ?? Ben URLconf yaklaşımını ListView alt sınıfımla kullanabiliyorum.

cevap

5

düşünün aşağıdaki sınıf temelli görünümü vardır:

class PostListView(ListView): 
    model = Post 

ProtectedPostListView = login_required(PostListView.as_view()) 

ve urls.py:

url(r'posts$', ProtectedPostListView) 

sonra bu yaklaşımı kullanırsanız ProtectedPostListView örn

alt sınıf yeteneğini kaybedebilir
class MyNewView(ProtectedPostListView): 
    #IMPOSSIBLE 

ve bunun nedeni, .as_view()'un bir işlevi döndürmesidir ve login_required dekoratörünü uyguladıktan sonra, bir fonksiyonla kaldınız, bu yüzden alt sınıflama yapılamaz. Diğer taraftan, ikinci yaklaşıma giderseniz, yöntem dekoratörünü kullanırsanız, alt sınıflama mümkündür. örn.

class PostListView(ListView): 
    model = Post 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(PostListView, self).dispatch(*args, **kwargs) 

class MyNewView(PostListView): 
    #LEGAL 
İlgili konular