← Назад к вопросам

Что такое 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

  1. DRY — меньше кода, больше переиспользования
  2. Встроенные функции — форма, пагинация, сортировка из коробки
  3. Mixins — легко комбинировать функциональность
  4. Наследование — можно создавать иерархии классов
  5. Явность — 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, который экономит время и снижает ошибки.