6

ListView から継承するビューを作成しており、ビューをログイン ユーザーに制限しようとしています。

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

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

そのリンクの上の段落は、次の質問に答えているようです。

本当??ListView のサブクラスで URLconf アプローチを使用できるようです。

4

1 に答える 1

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
于 2012-08-26T23:43:14.670 に答える