JavaRush /Курсы /Модуль 3: Django /Основы создания Class-Based Views (CBV)

Основы создания Class-Based Views (CBV)

Модуль 3: Django
4 уровень , 2 лекция
Открыта

Теперь, когда мы разобрались с преимуществами и особенностями CBV, давайте начнем писать код!

В этой лекции мы создадим наши первые Class-Based Views и изучим их основные возможности на практике.

1. Создание простого CBV

Class-Based Views (CBV) в Django — это классы, которые реализуют обработку HTTP-запросов. Они позволяют нам писать код структурированно, переиспользовать логику и легко настраивать поведение представлений.

Чтобы создать CBV, мы используем базовый класс View из модуля django.views. В отличие от FBV, где вся логика содержится в одной функции, CBV разделяют логику на отдельные методы класса, что делает представления более модульными.

Давайте создадим простейший CBV, который будет обрабатывать HTTP GET-запросы и возвращать строку "Hello, CBV!".

from django.http import HttpResponse
from django.views import View

# Определяем Class-Based View
class HelloCBV(View):
    def get(self, request):
        # Обработка GET-запроса
        return HttpResponse("Hello, CBV!")

В этом коде:

  • Мы создали класс HelloCBV, унаследованный от View.
  • Метод get обрабатывает HTTP GET-запросы. Его задача — вернуть HTTP-ответ.

Привязка CBV к маршруту

Чтобы использовать наше представление, нужно привязать его к URL. Для этого мы используем функцию as_view().

from django.urls import path
from .views import HelloCBV

urlpatterns = [
    path('hello/', HelloCBV.as_view(), name='hello_cbv'),
]

Функция as_view() превращает класс в вызываемую функцию, которую Django может использовать для обработки запросов. Это магия, которая позволяет CBV работать!

2. Переопределение методов CBV

Теперь давайте посмотрим, как переопределять методы CBV для обработки других HTTP-запросов (POST, PUT, DELETE и т.д.). Основные методы, которые можно переопределить в CBV, это:

  • get(self, request, *args, **kwargs) — обработка GET-запросов.
  • post(self, request, *args, **kwargs) — обработка POST-запросов.
  • put(self, request, *args, **kwargs) — обработка PUT-запросов.
  • delete(self, request, *args, **kwargs) — обработка DELETE-запросов.

Пример обработки разных HTTP-запросов

Создадим CBV, который обрабатывает как GET, так и POST-запросы.

from django.http import JsonResponse
from django.views import View

class MultiMethodView(View):
    def get(self, request):
        # Обработка GET-запроса
        return JsonResponse({"message": "This is a GET request"})

    def post(self, request):
        # Обработка POST-запроса
        return JsonResponse({"message": "This is a POST request"})

Использование POST-запроса

При обработке POST-запросов можно читать переданные данные из request.POST или request.body.

from django.http import JsonResponse
from django.views import View
import json

class PostDataView(View):
    def post(self, request):
        # Извлекаем данные из запроса
        data = json.loads(request.body)
        return JsonResponse({"received_data": data})

3. Создание CBV с кастомной логикой

Одной из мощных возможностей CBV является их кастомизация. Вы можете добавлять собственные методы и использовать их в рамках логики представления.

Создадим CBV с кастомным методом, который будет вычислять сумму двух чисел, переданных через параметры запроса.

from django.http import JsonResponse
from django.views import View

class SumView(View):
    def get(self, request):
        # Извлекаем параметры запроса
        a = int(request.GET.get('a', 0))
        b = int(request.GET.get('b', 0))
        result = self.calculate_sum(a, b)
        return JsonResponse({"sum": result})

    def calculate_sum(self, a, b):
        # Кастомный метод для вычисления суммы
        return a + b

Здесь мы определили метод calculate_sum, который выполняет вычисление суммы. Этот метод можно переиспользовать в других частях класса, что делает код более структурированным.

4. Переопределение метода dispatch

Метод dispatch — это точка входа для CBV. Он вызывается первым и определяет, какой метод (get, post, put, и т.д.) будет вызван в ответ на запрос.

Зачем переопределять dispatch? Ну, например, вы можете добавить логику аутентификации или логирование запросов на уровне dispatch, чтобы не дублировать эту логику в каждом методе.

Пример CBV с кастомным dispatch

Создадим CBV, который проверяет, авторизован ли пользователь перед обработкой запроса.

from django.http import JsonResponse
from django.views import View

class AuthRequiredView(View):
    def dispatch(self, request, *args, **kwargs):
        # Проверка, авторизован ли пользователь
        if not request.user.is_authenticated:
            return JsonResponse({"error": "Authentication required"}, status=401)
        return super().dispatch(request, *args, **kwargs)

    def get(self, request):
        return JsonResponse({"message": "You are authenticated!"})

В этом примере метод dispatch перехватывает запрос и выполняет проверку аутентификации перед передачей управления методу get.

5. Организация кода и преимущества CBV

Использование CBV помогает структурировать код и уменьшить его дублирование. Вместо того чтобы дублировать логику для разных HTTP-методов, вы можете определить ее в одном месте (например, в методе dispatch или кастомном методе класса).

Когда использовать CBV

  • Если представление сложное и может быть разделено на логические части.
  • Когда требуется обработка нескольких типов запросов.
  • Если есть возможность переиспользовать логику между разными представлениями.

Когда не использовать CBV

  • Если представление простое и обрабатывает только один тип запроса.
  • Когда вы только начинаете работать с Django, и CBV кажутся сложными.

6. Практическое задание

Попрактикуйтесь в создании CBV:

  1. Создайте CBV, который обрабатывает GET-запрос и возвращает список случайных чисел.
  2. Добавьте обработку POST-запроса, который принимает два числа и возвращает их произведение.
  3. Добавьте проверку авторизации в методе dispatch.

Подумайте, как вы могли бы организовать этот код, чтобы он был читаемым и удобным для поддержки.

На этом этапе вы овладели базовыми навыками создания и настройки Class-Based Views в Django. Поздравляем! В следующей лекции вы узнаете, как работать с TemplateView — классом CBV, который упрощает отображение шаблонов.

1
Задача
Модуль 3: Django, 4 уровень, 2 лекция
Недоступна
Создание простого Class-Based View (CBV)
Создание простого Class-Based View (CBV)
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ivan Уровень 59
28 июня 2025
Задание Создание простого Class-Based View (CBV) Так не работает, но засчитывается валидатором:

# Импортируем наше представление HelloWorldView из приложения app
from app.views import HelloWorldView
А так работает, но не засчитывается :(

# Импортируем наше представление HelloWorldView из приложения app
from ..app.views import HelloWorldView