Django CBV: что такое Class-Based Views и зачем они
Разбираемся, что такое CBV в Django и зачем они нужны. Преимущества, наследование и миксины простыми словами, с примерами кода.
В статье обзоре мы познакомились с Django, а так же рассмотрели Views - Представления на простом примере с использованием функций.
Так как часто сайты имеют схожий повторяющийся функционал, программисты придумали CBV - Class-Based Views.
Class-Based Views (CBV) это способ написания Views - Представлений, используя классы, с минимальным количеством кода, так как большинство сценариев предусмотрено через атрибуты и готовые методы (функции).
Стоит отметить, что Функциональные представления Function-Based Views (FBV) предпочтительней, когда требуется какое то нестандартное решение.
Class-Based Views стоит использовать из-за возможности наследования и переиспользования логики.
Под наследованием подразумевается возможность описать логику 1 раз и переиспользовать ее в дочерних классах автоматически.
Изменения которые получил родительский класс, автоматически распространяются на классы наследники, это удобно в больших проектах.
class BaseArticleView(TemplateView):
template_name = "news/article.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["category"] = self.get_category()
return context
def get_category(self):
raise NotImplementedError
class NewsArticleView(BaseArticleView):
def get_category(self):
return "news"
class BlogArticleView(BaseArticleView):
def get_category(self):
return "blog"Пример наследования BaseArticleView
В примере выше NewsArticleView и BlogArticleView получают имя шаблона (template_name) родителя BaseArticleView, а так же ошибку в случае отсутствия у них get_category и наследуют get_context_data.
Переиспользование логики это добавление небольших классов mixin - миксинов, которые отвечают за узкий функционал в классе представления VIew, ситуации для примера:
проверка прав доступа
добавление данных в контекст ответа
запись логов или уведомление на внешний сервис
class LoginRequiredMixin:
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return redirect("login")
return super().dispatch(request, *args, **kwargs)
class MyView(LoginRequiredMixin, ListView):
model = ArticleПример миксина LoginRequiredMixin
Требуется использовать наследование, когда у базового класса есть много логики, которая требуется и дочерним классам.
Выбор в пользу миксина требуется сделать тогда, когда речь идет об одном конкретном функционале, который может применяться к разным узким типам классов представлений View внутри проекта.
На примере кулинарии, наследование это допустим база в качестве хлебной лепешки, дочерними элементами будут пицца и хачапури.
Миксин же, это добавление масла или лука, то есть действие которое может применяться и к блюдам других типов.
В продолжение знакомства с Django и CBV, вы можете прочесть так же:
Если у вас остались вопросы по Class-Based Views или Django вы можете обратиться за консультацией к программисту.
По необходимости вы можете обратиться за консультацией
Вам может быть интересно

Как создать виртуальное окружение python venv

CRUD в разработке программ: что это и как работает

Как открыть XML-файл и посмотреть его в читаемом виде
Переменные окружения и секретные ключи в Python

Как получить данные из Wordstat от Яндекса по API на Python
