2017-09-16 7 views
0

私はProblemオブジェクトのクラスベースのビューを持っています。私はProblemの著者がProblem cbvを見ることができるようにしたい。他のログインしているユーザーは、禁止ページにリダイレクトする必要があります。不器用な私自身のdjangoの許可チェック

これは、get_template_name()メソッドの所有権をチェックすることで実現します。しかし、私が禁止されたテンプレートに文脈で渡したい場合は、get_context_data()の所有権をチェックし、適切な文脈を作る必要もあります。

これは機能しますが、半反復コードがあまりにも多く、ちょうど非常に非Python/Djangonicのようです。

どのような方法でこれを行うことができますか?これは私が作成した多くのClassBasedViewsの問題です。私はまたはBoardオブジェクトのlogged-in user == the authorを確実にしたい "Problem"オブジェクトと "Board"オブジェクトの両方を持っています。私がMixinなんか何かを持っているかのように思える。

class ProblemStudyView(UpdateView): 
    model = Problem 
    fields = "__all__" 

    def get_template_names(self): 
     problem = self.get_object() 
     if problem.author != self.request.user: 
      # User should not see this entry 
      context = {'original_author': problem.author, 'request_user': self.request.user} 
      template_name = "board/forbidden.html" 
      return template_name 
     else: 
      # This user is OK 
      template_name = "board/study.html" 
      return template_name 

    def get_context_data(self, **kwargs): 
     context = super(ProblemStudyView, self).get_context_data(**kwargs) 

     problem = self.get_object() 

     # Do the permission check a second time to setup correct context 
     if problem.author != self.request.user: 
      context = {'original_author': problem.author, 'request_user': self.request.user} 
      return context 
     else: 
      # User is ok; proceed as normal   
      return context 

答えて

0

あなたはPermissionRequiredMixinとカスタム許可を使用することができます。

はとにかく、ここで私のアプローチの一例です。

私はこのような何かしたい:PermissionDeniedExceptionが発生するので、使用(または変更)することができます

from django.contrib.auth.mixins import PermissionRequiredMixin 


class ProblemStudyView(PermissionRequiredMixin, UpdateView): 

    model = Problem 
    fields = "__all__" 
    permission_denied_message = 'YOURMESSAGEHERE' 
    raise_exception = True 
    template_name = 'board/study.html' 

    def dispatch(self, request, *args, **kwargs): 
     self.request = request # needed for has_permission 
     self.kwargs = kwargs # needed for get_object 
     return super().dispatch(request, *args, **kwargs) 

    def has_permission(self): 
     problem = self.get_object() 
     return problem.author == self.request.user 

を標準のDjangoのhttp禁じビュー: https://docs.djangoproject.com/en/1.11/ref/views/#the-403-http-forbidden-view

関連する問題