2012-08-26 7 views
5

私はListViewから継承したビューを作成しており、ログインしているユーザーにビューを制限しようとしています。クラスベースビューをデコレートする2つの方法の違いは何ですか?

https://docs.djangoproject.com/en/dev/topics/class-based-views/#decorating-in-urlconfによると、URLconfのlogin_requiredでデコレートすると、インスタンスごとにデコレータが適用されます。ビューのすべてのインスタンスをデコレートする場合は、別のアプローチをとる必要があります。ビューコード内のディスパッチメソッド。

私はクラスとインスタンスの違いを知っていると思っていましたが、このフレーズは私にとって何も意味しません。誰かが明確にすることができますか?あなたのクラス定義とは対照的に、URLconfにデコレータを持つこととは別に、2つのアプローチの違いは何ですか?

このリンクの段落は、「クラスベースのビューは関数ではないので、それらをデコレートすることは、as_viewを使用しているのか、サブクラスを作成しているのかによって異なります。

本当に??私はListconfの私のサブクラスでURLconfアプローチを使うことができるようです。

答えて

5

想像します、次のクラスベースのビューがあります。

class PostListView(ListView): 
    model = Post 

ProtectedPostListView = login_required(PostListView.as_view()) 

とあなたのurls.py:

url(r'posts$', ProtectedPostListView) 

あなたは、このアプローチを使用している場合は、ProtectedPostListView例えば

をサブクラス化する能力を失うを
class MyNewView(ProtectedPostListView): 
    #IMPOSSIBLE 

これは、.as_view()が関数を返すためですlogin_requiredデコレータを適用した後は、関数が残っているので、サブクラス化はできません。

一方、第2のアプローチ、つまりメソッドデコレータを使用すると、サブクラス化が可能です。 例:

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 
関連する問題