私は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