2017-01-18 4 views
0

私はクラスベースのビューを使用することはあまり快適ではありませんが、私は自分の特典を認識していますので、もっと頻繁に使用するようにしています。クラスベースのビュー:パーミッションを確認する場所は?

特定のエンティティを管理するために、パスパラメータ:manage/:idを受け取るビューがあります。

class MyView(TemplateView): 
    template_name = '...' 

    def get_context_data(self, **kwargs): 
    context = super(MyView, self).get_context_data(**kwargs) 
    context['entity'] = get_object_or_404(Entity, pk=self.args[0]) 
    return context 

Entityには、特別なアクションを実行する許可ユーザーのリストが含まれています。このビューMyViewは、これらの特別なアクションの1つです。

ビューのデコレータを作ってみましたが、最初にEntityを見つける必要がありましたので、その方法をどうやって確認するかはわかりませんでした。

今、私はcheck_permission(request, entity)機能を持っており、現在のユーザーがこれらの許可されたユーザーの1つであるかどうかを確認します。

私の質問では、これらのビューのいずれかになるのようなクラスベースのビューでこの機能を「特別なアクション」と呼ぶべきですか?

get_context_data()から電話する必要がありますか?

答えて

1

dispatch()に入れてください。それは次のようになります。

class MyView(TemplateView): 
    template_name = '...' 

    def dispatch(self, request, *args, **kwargs): 
     entity = get_object_or_404(Entity, pk=args[0]) 
     if not check_permission(request, entity): 
      raise Http404 
     return super(MyView, self).dispatch(request, *args, **kwargs) 
+0

「エンティティ」はどこで取得できますか? 'dispatch'と' get_context_data'の両方で 'get_object_or_404'をする必要がありますか? – dabadaba

+0

'entity'は' Entity'のインスタンスですか?私の頭の上から覚えていますが、* args'と '** kwargs'か' self.args'のどちらかで(get_context_data()と同じ方法で)データを取得するのに必要なデータがあります。 'self.kwargs' – yedpodtrzitko

+0

それが私の心配だと確信しています、私はそれを2回取得する必要がありますか? 'get_object_or_404(Entity、pk = self.args [0])'だけを1回だけ行うことはできませんか? – dabadaba

0

Django Bracesを見て、それが権限を中心に設計されているミックスインの固体セットです。

どのくらい具体的にアクセス権を扱うかは、実装に大きく依存します。私はdispatch()でそれをやっていますが、その前にBracesが行いますが、オブジェクトやクエリーセットに固有のものであれば、実際のget_objectメソッドやget_querysetメソッドでDetailViewの一部として実行します。

たとえば、作成者がエンティティに関連付けられている場合は、get_objectを上書きして、現在ログインしているユーザーがエンティティの作成者であることを確認できます。

class EntityView(LoginRequiredMixin, DetailView): 
    model = Thing 

    def get_object(self, **kwargs): 
     return Entity.objects.get_object_or_404(
      pk=kwargs['entity_id'], 
      creator=self.request.user 
     ) 

注:LoginRequiredMixinはブレースの一部です。非常に滑らか。

0

yedpodtrzitkoが言っているように、dispatchの権限をチェックすることができます。ミックスインの中に投げ込んで、あなたの意見を述べることも良い考えだと思います。

はここに例を示します

from django.core.exceptions import PermissionDenied 


class ViewPermissionsMixin(object): 
    """Base class for all custom permission mixins to inherit from""" 
    def has_permissions(self): 
     return True 

    def dispatch(self, request, *args, **kwargs): 
     if not self.has_permissions(): 
      raise PermissionDenied 
     return super(ViewPermissionsMixin, self).dispatch(
      request, *args, **kwargs) 

class MyCustomPermissionMixin(ViewPermissionsMixin): 

    def has_permissions(self): 
     # here you will have access to both 
     # self.get_object() and self.request.user 
     return self.request.user in self.get_object().special_list_of_people 

今、あなたのビューにMyCustomPermissionMixinを投げることができます。

class MyView(MyCustomPermissionMixin, TemplateView): 
    # ... 

あなたのケースでは、あなたがTemplateViewを使用していることから、あなたもget_object()方法を行う必要がありますあなたが対処したいオブジェクトを返します。テンプレートビューにはデフォルトでこのメソッドがありません。

最後に、Djangoのクラスベースのビューが好きになると言いたいのは、その使い方についてもっと学ぶことだけです。

関連する問題