Как я могу использовать более высокий уровень абстракции представлений на основе классов в django?

У меня есть проект, в котором буквально каждое представление имеет множество пользовательских методов валидации и контекстных данных, которые генерируются на основе данных пользователя get или post, и когда я читал документацию, я не смог найти ни одного примера того, как смешивать представления на основе классов django с пользовательскими валидаторами и контекстом, который генерируется после прихода запроса.

Например, у меня есть представление (код ниже), где я должен подтвердить много данных перед сохранением этих входящих данных в базе данных, и мне не нравится такой подход к использованию CBV. И я понятия не имею, как я могу сделать уровень абстракции CBV выше, чем он есть сейчас.

Можете ли вы дать мне несколько советов, подсказок, руководств или просто объяснить, как я могу не использовать базовый класс django.views.View в таком сложном случае, а вместо него использовать высокий уровень абстракции CBV .

Вот пример одного из моих представлений, основанных на классах:

class UnauthorizedUserMixin(View):
    def dispatch(self, request, **kwargs):
        if not request.user.is_authenticated:
            return redirect("login")
        return super().dispatch(request)


class SendMailView(TemplateView, UnauthorizedUserMixin):
    template_name = "new_mail.html"

    def post(self, request):
        self.request = request

        if self.request.POST.get("back"):
            return redirect("all-sent-mails")

        all_data_validation_methods = [
            self._check_if_not_all_fields_are_filled, self._check_if_recipient_doesnt_exists,
            self._check_if_sender_is_equal_to_recipient, self._check_if_input_fields_are_too_long
        ]

        self.form = dict(self.request.POST.items())
        for validation_method in all_data_validation_methods:
            error = validation_method()
            if error:
                return render(self.request, self.template_name, {"form": self.form, "error": error})

        self.save_and_send_mail()
        return redirect("all-sent-mails")

    def _check_if_not_all_fields_are_filled(self):
        if not all(self.form.values()):
            return "Looks like some fields are empty !"

    def _check_if_recipient_doesnt_exists(self):
        try:
            self.to_user = User.objects.get(username=self.form["to_user"])
        except ObjectDoesNotExist:
            return f"No such user - \"{self.form['to_user']}\""

    def _check_if_sender_is_equal_to_recipient(self):
        self.from_user = User.objects.get(username=self.request.user)
        if self.from_user == self.to_user:
            return "You are trying to send mail to yourself !"

    def _check_if_input_fields_are_too_long(self):
        title_length = len(self.form["title"])
        body_length = len(self.form["body"])
        if title_length > 64:
            return f"The title is too long. Now it's {title_length}, but maximum length is 64 characters"
        if body_length > 1000:
            return f"Your text message is too big. Now it's {body_length} characters, but maximum length is 1000."

    def save_and_send_mail(self):
        new_mail = Mail()
        new_mail.to_user = self.to_user
        new_mail.from_user = self.from_user
        new_mail.title = self.form["title"]
        new_mail.body = self.form["body"]
        new_mail.to_user_inf = self.to_user.username
        new_mail.from_user_inf = self.from_user.username
        new_mail.save()
Вернуться на верх