← Назад к вопросам
Что такое CBV в Django?
2.0 Middle🔥 251 комментариев
#DevOps и инфраструктура#Django
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
CBV в Django — Class-Based Views
CBV (Class-Based Views) — это подход к написанию обработчиков запросов в Django с использованием классов вместо функций. Это мощный и гибкий механизм, который значительно сокращает дублирование кода.
Функции vs Классы
Function-Based Views (FBV):
def list_articles(request):
articles = Article.objects.all()
return render(request, "articles/list.html", {"articles": articles})
def get_article(request, pk):
article = Article.objects.get(pk=pk)
return render(request, "articles/detail.html", {"article": article})
Class-Based Views (CBV):
from django.views import View
from django.views.generic import ListView, DetailView
class ArticleListView(ListView):
model = Article
template_name = "articles/list.html"
context_object_name = "articles"
class ArticleDetailView(DetailView):
model = Article
template_name = "articles/detail.html"
Встроенные Generic Views
Django предоставляет готовые классы для частых сценариев:
Список объектов:
class ArticleListView(ListView):
model = Article
paginate_by = 20 # Автоматическая пагинация
context_object_name = "articles"
ordering = "-created_at" # Сортировка
Детальный просмотр:
class ArticleDetailView(DetailView):
model = Article
slug_field = "slug" # Поле для поиска
Создание объекта:
from django.views.generic import CreateView
from django.urls import reverse_lazy
class ArticleCreateView(CreateView):
model = Article
fields = ["title", "content", "category"]
template_name = "articles/form.html"
success_url = reverse_lazy("articles:list")
Обновление объекта:
class ArticleUpdateView(UpdateView):
model = Article
fields = ["title", "content", "category"]
template_name = "articles/form.html"
success_url = reverse_lazy("articles:list")
Удаление объекта:
class ArticleDeleteView(DeleteView):
model = Article
success_url = reverse_lazy("articles:list")
template_name = "articles/confirm_delete.html"
Кастомизация через методы
Вы можете переопределять методы для добавления логики:
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import redirect
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
fields = ["title", "content"]
login_url = "login"
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["categories"] = Category.objects.all()
return context
def get_queryset(self):
return Article.objects.filter(author=self.request.user)
Mixins — переиспользуемая логика
Mixins — это классы-помощники для добавления функциональности:
class UserIsAuthorMixin:
def get_queryset(self):
return super().get_queryset().filter(author=self.request.user)
class ArticleUpdateView(UserIsAuthorMixin, UpdateView):
model = Article
fields = ["title", "content"]
Жизненный цикл CBV
Порядок вызова методов:
class ArticleDetailView(DetailView):
def setup(self, request, *args, **kwargs):
return super().setup(request, *args, **kwargs)
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
def get_object(self, queryset=None):
return super().get_object(queryset)
def get_context_data(self, **kwargs):
return super().get_context_data(**kwargs)
def render_to_response(self, context, **kwargs):
return super().render_to_response(context, **kwargs)
Преимущества CBV
- DRY — меньше кода, больше переиспользования
- Встроенные функции — форма, пагинация, сортировка из коробки
- Mixins — легко комбинировать функциональность
- Наследование — можно создавать иерархии классов
- Явность — HTTP методы явно видны
Пример интеграции в urls.py
from django.urls import path
from .views import ArticleListView, ArticleDetailView, ArticleCreateView
urlpatterns = [
path("articles/", ArticleListView.as_view(), name="articles:list"),
path("articles/<int:pk>/", ArticleDetailView.as_view(), name="articles:detail"),
path("articles/new/", ArticleCreateView.as_view(), name="articles:create"),
]
CBV — это правильный способ работать с Django, который экономит время и снижает ошибки.