Django: представление на основе классов с миксином и методом отправки

Обычно я используюdispatch метод представления на основе классов для установки некоторых начальных переменных или добавления некоторой логики на основе разрешений пользователя.

Например,

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

Это работает как ожидалось: когда анонимный пользователь посещает страницы,dispatch методLoginRequiredMixin вызывается, а затем перенаправляет пользователя на страницу входа.

Но если я хочу добавить некоторые разрешения для этого представления или установить некоторые начальные переменные, например,

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 методы mixins, которые наследует представление, еще не были вызваны. Так, например, чтобы иметь возможность запрашивать разрешения пользователя, я должен повторить проверку с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)

Этот пример прост, но иногда в миксине есть более сложная логика: он проверяет разрешения, делает некоторые вычисления и сохраняет их в атрибуте класса и т. Д.

Сейчас я решаю это путем копирования некоторого кода из миксина (как в примере выше) или путем копирования кода изdispatch метод представления другого миксина и наследование его после того, как первый выполнил их по порядку (что не очень красиво, потому что этот новый миксин используется только одним представлением).

Есть ли какой-то правильный способ решить такие проблемы?

Ответы на вопрос(4)

Ваш ответ на вопрос