일반적으로 클래스 기반 뷰의 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
유지 mixin 방법,보기 그 때문에 상속받은 자들이 아직 부름을받지 못했다.
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)
이 예제는 간단하지만, 때로는 혼합에 좀 더 복잡한 논리가 있습니다 : 그래서, 예를 들어, 사용자의 권한을 요청할 수 있도록, 나는 LoginRequiredMixin
에서 유효성 검사를 반복 할 필요가를 확인 일부 계산을 수행하고 클래스 속성에 저장합니다.
이제는 mixin에서 일부 코드를 복사하거나 (위의 예처럼) 코드를 dispatch
보기에서 복사하여 해결합니다. 다른 믹스 인에게 보내고 순서대로 실행하려면 첫 번째 믹스 인을 이어 받아야합니다. (이 새로운 믹스 인은 하나의보기에서만 사용되기 때문에 그다지 좋지 않습니다.)
이러한 문제를 해결할 수있는 적절한 방법이 있습니까?
처음''super (GenerateReportView, self) .dispatch (* args, ** kwargs)''를 호출하십시오. –
@MihaiZamfir 예를 들어''LoginRequiredMixin''는''HttpResponseRedirect'' 객체를 반환하기 때문에 작동하지 않을 것입니다. 그래서 우리가 변수에 저장한다면, 우리가이 변수를''dispatch'' 메소드의 끝에서 반환 할 때까지 로그인 뷰로 리디렉션하지 않습니다. – vero4ka
하지만 응답이 리디렉션인지 확인한 다음 디스패치를 계속 수행 할 수 있습니다. –