通常、クラスベースのビューのdispatch
メソッドを使用して、いくつかの初期変数を設定したり、ユーザーの権限に基づいてロジックを追加したりします。例えばDjango:mixinsとディスパッチメソッドを持つクラスベースのビュー
、予想通り
from django.views.generic import FormView
from braces.views import LoginRequiredMixin
class GenerateReportView(LoginRequiredMixin, FormView):
template_name = 'reporting/reporting_form.html'
form_class = ReportForm
def get_form(self, form_class):
form = form_class(**self.get_form_kwargs())
if not self.request.user.is_superuser:
form.fields['report_type'].choices = [
choice for choice in form.fields['report_type'].choices
if choice[0] != INVOICE_REPORT
]
return form
それは動作します:匿名ユーザーがページを訪れたとき、LoginRequiredMixinのdispatch
メソッドが呼び出され、その後、ログインページにユーザーをリダイレクトしています。
しかし、私は、それが動作しないいくつかのケースでは
class GenerateReportView(LoginRequiredMixin, FormView):
def dispatch(self, *args, **kwargs):
if not (
self.request.user.is_superuser or
self.request.user.is_manager
):
raise Http404
return super(GenerateReportView, self).dispatch(*args, **kwargs)
、例えば、このビューのいくつかの権限を追加したり、いくつかの初期の変数を設定したい場合はdispatch
ミックスインの方法、眺めているので、継承は、まだ呼び出されていません。したがって、たとえば、ユーザーの権限を求めることができるように、私はLoginRequiredMixin
から検証を繰り返す必要があります。
class GenerateReportView(LoginRequiredMixin, FormView):
def dispatch(self, *args, **kwargs):
if self.request.user.is_authenticated() and not (
self.request.user.is_superuser or
self.request.user.is_manager
):
raise Http404
return super(GenerateReportView, self).dispatch(*args, **kwargs)
この例は単純ですが、時には混合でいくつかのより複雑なロジックがあります。それはをチェック
今のところ私はmixinからいくつかのコードをコピーするか(上記の例のように)、ビューのdispatch
メソッドからコードをコピーすることで解決します別のミックスインに転送し、最初のミックスを継承して順番に実行します(これは、新しいミックスインが1つのビューでのみ使用されるためです)。
このような問題を解決する方法はありますか?
最初に '' super(GenerateReportView、self).dispatch(* args、** kwargs) ''を呼び出します。 –
@MihaiZamfirたとえば、 '' LoginRequiredMixin''が '' HttpResponseRedirect''オブジェクトを返すので、これは動作しません。変数に格納する場合は、 '' dispatch''メソッドの最後にこの変数を返すまで、ログインビューにリダイレクトされません。 – vero4ka
ですが、応答がリダイレクトであるかどうかを確認してから、ディスパッチを続行してください。 –