Гид по технологиям

Django: Class-Based Views для CRUD — пошаговое руководство

7 min read Django Обновлено 27 Apr 2026
Django CBV для CRUD: пошаговый гид
Django CBV для CRUD: пошаговый гид

Класс‑ориентированные представления (CBV) в Django упрощают реализацию операций CRUD (Create, Read, Update, Delete) за счёт повторного использования кода, наследования и встроенной логики. В этой статье вы найдёте пошаговую инструкцию по созданию простого менеджера задач на CBV, шаблоны кода, советы по расширению, чек‑листы, тесты и рекомендации по отладке.

Введение

иконки блокнот, книга, переработка и корзина для мусора, иллюстрирующие операции Создать Читать Обновить Удалить

Одно из ключевых преимуществ Django — встроенная поддержка проектов, построенных вокруг операций CRUD. Хотя в Django широко используются function-based views (FBV), класс‑ориентированные представления (CBV) дают дополнительные возможности: модульность, наследование, переиспользование и удобную структуру кода. В этом руководстве вы реализуете приложение «Менеджер задач», увидите готовый код и получите набор практических приёмов.

Что такое класс‑ориентированные представления

Представление (view) в Django — это функция или класс, который получает HTTP‑запрос и возвращает HTTP‑ответ. CBV — это представления, реализованные как классы Python. Они инкапсулируют поведение в методах (например, get(), post()) и позволяют использовать наследование и миксины для композиции функциональности.

Короткое определение терминов:

  • CBV — класс, обрабатывающий HTTP‑запросы; содержит методы get/post и атрибуты для настройки.
  • CRUD — базовый набор операций для работы с ресурсами: Create, Read, Update, Delete.

Важно: CBV не заменяют FBV во всех случаях — иногда простая функция читается легче. Ниже — критерии выбора и примеры.

Встроенные класс‑представления Django

Django поставляется с набором готовых CBV для типичных задач:

  • ListView — отображение списка объектов.
  • DetailView — подробное представление одного объекта.
  • CreateView — форма для создания нового объекта + обработка отправки.
  • UpdateView — форма для редактирования существующего объекта.
  • DeleteView — подтверждение и удаление объекта.
  • TemplateView, RedirectView, FormView — дополнительные варианты.

Эти базовые представления покрывают большинство CRUD‑сценариев и легко настраиваются через атрибуты и переопределение методов.

Быстрый план: что мы построим

Мы создадим приложение task_manager, реализуем модель Task, формы, CBV для CRUD, шаблоны и маршруты. Затем добавим практические улучшения: миксины, переопределение form_valid/get_context_data, тесты и инструкцию по развертыванию.

Настройка проекта Django

  1. Установите Django в виртуальное окружение:
pip install django
  1. Создайте проект project_core в текущей папке:
django-admin startproject project_core .
  1. Создайте приложение task_manager:
python manage.py startapp task_manager
  1. В settings.py добавьте приложение в INSTALLED_APPS:
INSTALLED_APPS = [
    'task_manager',
]
  1. В project_core/urls.py подключите маршруты приложения:
from django.urls import path, include

urlpatterns = [
    path('', include('task_manager.urls')),
]

Примечание: при развертывании добавьте конфигурацию static и media по рекомендации Django.

Модель задачи

Откройте task_manager/models.py и добавьте модель Task:

from django.db import models

class Task(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField()
    completed = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

Выполните миграции:

python manage.py makemigrations && python manage.py migrate

Совет: добавьте индекс по created_at и в будущем можно добавить user ForeignKey для мультипользовательского приложения.

Форма для Create и Update

Создайте task_manager/forms.py:

from django import forms
from .models import Task

class TaskForm(forms.ModelForm):
    class Meta:
        model = Task
        fields = ['title', 'description', 'completed']

        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control',}),
            'description': forms.Textarea(attrs={'class': 'form-control',}),
            'completed': forms.CheckboxInput(attrs={'class': 'form-check-input'}),
        }

Комментарий: widgets помогают быстро подключить Bootstrap‑стили.

Представления для CRUD

Откройте task_manager/views.py и импортируйте базовые классы:

from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Task
from .forms import TaskForm

Список задач

class TaskListView(ListView):
    model = Task
    template_name = 'task_manager/task_list.html'
    context_object_name = 'tasks'
    paginate_by = 10

    def get_queryset(self):
        return Task.objects.order_by('-created_at')

Пояснения:

  • paginate_by включён для постраничного вывода.
  • get_queryset позволяет фильтровать/сортировать.

Детали задачи

class TaskDetailView(DetailView):
    model = Task
    template_name = 'task_manager/task_detail.html'

Создание задачи

class TaskCreateView(CreateView):
    model = Task
    form_class = TaskForm
    template_name = 'task_manager/task_form.html'
    success_url = reverse_lazy('task_list')

    def form_valid(self, form):
        # дополнительная логика перед сохранением
        return super().form_valid(form)

Обновление задачи

class TaskUpdateView(UpdateView):
    model = Task
    form_class = TaskForm
    template_name = 'task_manager/task_form.html'
    success_url = reverse_lazy('task_list')

Удаление задачи

class TaskDeleteView(DeleteView):
    model = Task
    template_name = 'task_manager/task_confirm_delete.html'
    success_url = reverse_lazy('task_list')

Советы по расширению:

  • Переопределяйте get_context_data, чтобы добавить дополнительные данные в шаблон.
  • Используйте миксины (например, LoginRequiredMixin) для авторизации.
  • Для AJAX‑форм можно возвращать JsonResponse в form_invalid/form_valid.

Маршруты приложения

Создайте task_manager/urls.py:

from django.urls import path
from .views import TaskListView, TaskDetailView, TaskCreateView, TaskUpdateView, TaskDeleteView

urlpatterns = [
    path('', TaskListView.as_view(), name='task_list'),
    path('create/', TaskCreateView.as_view(), name='task_create'),
    path('tasks//', TaskDetailView.as_view(), name='task_detail'),
    path('tasks//update/', TaskUpdateView.as_view(), name='task_update'),
    path('tasks//delete/', TaskDeleteView.as_view(), name='task_delete'),
]

Обратите внимание: as_view() преобразует класс в вызываемый объект для обработки запроса.

Шаблоны

Создайте папку task_manager/templates/task_manager и добавьте base.html и четыре шаблона ниже.

task_list.html

{% extends 'base.html' %}

{% block content %}

Your Tasks

Add Task {% for task in tasks %}
{{ task.title }}

{{ task.description|truncatechars:50 }}

Completed: {% if task.completed %}Yes{% else %}No{% endif %}

Read more Delete task
{% empty %}

No tasks yet.

Add Task {% endfor %}
{% endblock %}

a list of tasks in a task manager app

task_detail.html

{% extends 'base.html' %}

{% block content %}

{{ task.title }}

{{ task.description }}

Completed: {% if task.completed %}Yes{% else %}No{% endif %}

Edit task Delete task {% endblock %}

полные детали задачи «купить продукты»

task_form.html

{% extends 'base.html' %}

{% block content %}
  

Create Task

{% csrf_token %} {{ form.as_p }}
{% endblock %}

форма для создания и редактирования задач

task_confirm_delete.html

{% extends 'base.html' %}

{% block content %}
  

Confirm Delete

Are you sure you want to delete "{{ object.title }}"?

{% csrf_token %} Cancel
{% endblock %}

страница подтверждения удаления задачи

Паттерны и приёмы для CBV

  1. Миксины для повторной логики
from django.contrib.auth.mixins import LoginRequiredMixin

class OwnerRequiredMixin(LoginRequiredMixin):
    def get_queryset(self):
        qs = super().get_queryset()
        return qs.filter(owner=self.request.user)
  1. Переопределение get_context_data:
def get_context_data(self, kwargs):
    context = super().get_context_data(kwargs)
    context['now'] = timezone.now()
    return context
  1. form_valid для дополнительной логики (например, автозаполнение автора):
def form_valid(self, form):
    form.instance.owner = self.request.user
    return super().form_valid(form)
  1. Используйте reverse_lazy в атрибутах класса, чтобы избежать проблем с импортами при загрузке модулей.

  2. Для сложных операций используйте смешение CBV и функций: реализуйте лёгкий FBV для специфичных endpoint’ов и CBV для CRUD.

Когда CBV работают хуже FBV (примеры)

  • Очень простая логика, где одна функция обрабатывает GET и POST без большого количества ветвлений — FBV может быть короче.
  • Если нужен сложный поток запросов с множеством ранних return и разных типов ответов — иногда FBV читаются проще.
  • Если вы не используете наследование и повторное использование, CBV добавляют уровень абстракции без выгоды.

Альтернативы и расширения

  • Django REST Framework (DRF) — если требуется API. DRF предлагает ViewSets, GenericAPIView и ModelViewSet для CRUD по API.
  • Формы на фронтенде (React/Vue) + API на Django — для интерактивных SPA.
  • Function-based views — для простых страниц и когда нужна явная логика запроса.

Модель принятия решения (Mermaid)

Ниже — упрощённая диаграмма для выбора типа представления:

flowchart TD
  A[Нужен HTTP интерфейс?] -->|Нет| B[Не нужно Django view]
  A -->|Да| C[Это API?]
  C -->|Да| D[Использовать DRF ModelViewSet]
  C -->|Нет| E[Это CRUD?]
  E -->|Да| F[Использовать CBV 'List/Create/Update/Delete']
  E -->|Нет| G[Рассмотреть TemplateView или FBV]

Чек‑листы

Чек‑лист разработчика перед релизом:

  • Миграции применены и закомичены
  • Все URL покрыты тестами
  • Формы защищены CSRF
  • Ограничен доступ (LoginRequired/Permission) при необходимости
  • Шаблоны не раскрывают чувствительные данные

Чек‑лист для ревью CBV:

  • Используются built‑in атрибуты (template_name, model, form_class)
  • Не дублируется логика между представлениями (вынести в миксин)
  • Переопределены методы корректно (вызов super)
  • Пагинация и сортировка реализованы при необходимости

Критерии приёмки

  • CRUD эндпоинты возвращают ожидаемые страницы
  • Созданные/обновлённые задачи сохраняются в базе
  • Удаление подтверждается и объект исчезает
  • Тесты на основные сценарии (создать, прочитать, обновить, удалить) проходят

Тесты и тест‑кейсы (примеры)

Примеры unittest/pytest для Task:

  • Создание задачи: POST на create/ возвращает 302 и объект появляется в базе.
  • Просмотр списка: GET на / возвращает 200 и контекст содержит tasks.
  • Редактирование: POST на update/ изменяет поля.
  • Удаление: POST на delete/ удаляет объект.

Минимальные acceptance тесты (поведенческие):

  • Незаполненная форма возвращает ошибки валидации.
  • Попытка доступа к редактированию чужой записи запрещена (если реализована авторизация).

Руководство инцидента и отката

Если после релиза CRUD перестал работать:

  1. Проверить логи веб‑сервера и Django (traceback).
  2. Запустить локально failing view через manage.py runserver. Проверить тесты.
  3. Если миграции ломают схему, откатить миграцию:
python manage.py migrate app_name 
  1. Вынести проблемную логику в feature branch, выполнить исправление и повторный деплой.

Миграция с FBV на CBV — практические советы

  • Начните с ListView/DetailView для read‑части, это самая безопасная замена.
  • Скопируйте логику из FBV в методы CBV: GET → get(), POST → post() или form_valid/form_invalid.
  • Сохраните url‑имена и шаблоны, чтобы минимизировать изменения на фронтенде.

Безопасность и приватность

  • Всегда используйте csrf_token в формах POST.
  • Ограничьте доступ к изменению и удалению (авторизация, права).
  • Не выводите идентификаторы/интерны моделей в публичные шаблоны без маскировки.
  • Для пользовательских данных соблюдайте требования локального законодательства по хранению и удалению данных.

Совместимость и масштабирование

  • При добавлении пользователей (мульти‑тенантность) добавьте owner ForeignKey и фильтрацию в get_queryset.
  • Для больших наборов данных используйте постраничную загрузку и индексы в базе.
  • Если нагрузка растёт, рассмотрите кеширование ListView и частичных фрагментов шаблонов.

Шаблоны сообщений для соцсетей

OG заголовок и описание для предпросмотра:

  • og:title: Django CBV для CRUD: быстрый старт
  • og:description: Пошаговое руководство по созданию менеджера задач с класс‑представлениями в Django: код, шаблоны, тесты и чек‑листы.

Короткое объявление (100–200 слов)

Новый быстрый старт по Django: в статье показано, как за несколько шагов создать менеджер задач на класс‑представлениях (ListView, DetailView, CreateView, UpdateView, DeleteView). Вы получите рабочую модель Task, формы, маршруты и шаблоны, а также советы по расширению, тесты и готовые чек‑листы. Руководство подходит разработчикам, которые хотят перейти от function‑based views к более модульной архитектуре.

Глоссарий — одно предложение на термин

  • CBV — класс‑представление в Django, реализует обработку HTTP‑запросов методами класса.
  • FBV — function‑based view, представление, реализованное функцией.
  • CRUD — операции создания, чтения, обновления и удаления сущностей.

Часто задаваемые вопросы

Нужно ли переходить на CBV во все проекты?

Нет. CBV полезны при повторном использовании логики и когда нужен чистый, организованный код. Для простых страниц FBV остаются удобными.

Можно ли использовать CBV с AJAX?

Да. Переопределяйте form_valid/form_invalid и возвращайте JsonResponse для AJAX‑запросов.

Как реализовать авторизацию в CBV?

Добавляйте миксины, например LoginRequiredMixin, PermissionRequiredMixin или пишите собственные миксины, переопределяя get_queryset и dispatch.

Примеры часто встречующихся ошибок и их исправление

  • Ошибка: TemplateDoesNotExist — проверьте template_name и пути в TEMPLATES DIRS.
  • Ошибка: NoReverseMatch — проверьте имена URL и значения pk/slug при reverse/reverse_lazy.
  • Ошибка: CSRF verification failed — убедитесь, что в шаблонах есть {% csrf_token %}.

Заключение

Класс‑ориентированные представления упрощают создание CRUD‑функциональности и делают код более поддерживаемым. Начните с базовых Generic CBV (ListView, DetailView, CreateView, UpdateView, DeleteView), добавьте миксины для повторяемой логики и покрывайте изменения тестами. При необходимости комбинируйте CBV с FBV и API‑подходом (DRF) — выбор инструмента зависит от потребностей проекта.

Важно

CBV — это не панацея, но мощный инструмент в арсенале Django‑разработчика. Используйте миксины и тесты, чтобы поддерживать качество кода.

Резюме

  • CBV ускоряют разработку CRUD
  • Переопределяйте get_queryset, form_valid и get_context_data для кастомных сценариев
  • Используйте миксины для авторизации и общих правил
  • Покрывайте критические сценарии тестами
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро