Как я могу использовать более высокий уровень абстракции представлений на основе классов в 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()