2011-07-08 5 views
7

私はDjango(1.3から始まります)のかなり新しいです。アプリケーションを構築する際には、組み込みのクラスの組み合わせを使用し、コンテキストに追加する必要がある場所をサブクラス化して、新しいクラスベースの汎用ビューを最初の日から使用しました。Djangoクラスベースの一般的なビューと認証

私の問題は、私の意見に戻って、ログインしたユーザーだけがアクセスできるようにする必要があることです。私が見つけたすべてのドキュメントは、古い機能の一般的なビューでこれを行う方法を示しますが、クラスベースではできません。ここで

は、例のクラスである:

class ListDetailView(DetailView): 
    context_object_name = "list" 

    def get_queryset(self): 
     list = get_object_or_404(List, id__iexact=self.kwargs['pk']) 
     return List.objects.all() 

    def get_context_data(self, **kwargs): 
     context = super(ListDetailView, self).get_context_data(**kwargs) 
     context['subscriber_list'] = Subscriber.objects.filter(lists=self.kwargs['pk']) 
     return context 

私はDjangoの新しいクラスベースのビューに認証を追加するにはどうすればよいですか?

+0

[djangoクラスベースビューで許可\ _requiredデコレータを使用する方法]の複製可能性(http://stackoverflow.com/questions/6069070/how-to-use-permission-required-decorators-on-django-クラスベースのビュー) – meshy

答えて

19

また、ビューのクラスを派生させる認証mixinのオプションもあります。だから、this mixin from brack3t.comを使用して:

class LoginRequiredMixin(object): 

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

あなたは、このような新しい "認証に必要な" ビュー作成することができます。必要に応じていない他の追加と

from django.views.generic import DetailView 

class MyDetailView(LoginRequiredMixin, DetailView): 
    .... 

を。非常に自分自身を繰り返さないように感じる。

+0

ニース!私はこのアプローチを好む。 – pwalsh

6

ドキュメントには、decorating class-based viewsのセクションがあります。古いバージョンのlogin_requiredなどを使用したい場合は、その方法があります。

+0

素晴らしい、私は、感謝を開始します。 – pwalsh

+1

私は、同じリンクに記載されているディスパッチ方法を使用して、urlconfをきれいに保つのが好きです。別の方法は、DetailViewをディスパッチメソッドでサブクラス化し、それをRestrictedDetailViewと呼んだり、RestrictedDetailViewを他の場所でサブクラス化したりすることです。 – Dave

+0

上記のリンクが変更されています。 https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/#decorating-the-class now –

5

は、私がどのリストビューを飾るための方法を説明しています:

class MyListView(ListView): 
    decorator = lambda x: x 

    @method_decorator(decorator) 
    def dispatch(self, request, *args, **kwargs): 
     return super(MyListView, self).dispatch(request, *args, **kwargs) 

このようなクラスベースのビューを書き込んだ後、 あなたは直接ように、URLに任意の関数ベースのデコレータを挿入することができます。

url(r'^myurl/$', MyListView.as_view(decorator=login_required)) 
関連する問題