Короткий ответ
FBV — обычная функция request -> response, проще для чтения в простых случаях; CBV — класс с методами get/post и т. п., удобен для переиспользования логики через наследование и миксины.
Как это работает подробнее
В FBV вся логика для всех HTTP-методов обычно находится в одной функции с проверкой request.method. В CBV Django вызывает метод as_view(), который создаёт диспетчер, и далее вызывается метод класса, совпадающий по имени с HTTP-методом (get, post, put...).
Пример кода
example.py
from django.http import HttpResponse
from django.views import View
def article_detail(request, pk):
if request.method == "POST":
return HttpResponse(f"updated {pk}")
return HttpResponse(f"article {pk}")
class ArticleDetailView(View):
def get(self, request, pk):
return HttpResponse(f"article {pk}")
def post(self, request, pk):
return HttpResponse(f"updated {pk}")Что использовать на практике
- Практика. FBV проще читать для небольших, не повторяющихся обработчиков. CBV и generic views (
ListView,CreateView) сокращают код для типовых CRUD-страниц за счёт наследования, но добавляют косвенность — нужно знать, какие методы и атрибуты переопределять.
Подводные камни
- Риск. Использование generic CBV «на всякий случай» там, где нужна однократная простая логика, что усложняет чтение кода; обратная ситуация — копирование одинакового кода в несколько FBV вместо выделения общей CBV/миксина.