Class-Based Views (CBVs) are Django’s object-oriented view pattern where views are Python classes inheriting from View or generic view classes (TemplateView, ListView, DetailView, CreateView, UpdateView, DeleteView), with behavior defined by overriding methods (get, post, get_queryset, get_context_data) and composed via mixins.
CBVs solve the problem of repetitive boilerplate in common view patterns (list, detail, create, update, delete) by providing reusable base classes that implement standard CRUD workflows. Instead of writing if request.method == 'POST': in every function, developers override specific methods (form_valid, get_queryset) and the framework handles the rest. Mixins (LoginRequiredMixin, PermissionRequiredMixin) compose cross-cutting concerns declaratively.
- URL maps to
as_view()—path('post/<int:pk>/', PostDetailView.as_view(), name='detail') as_view()returns callable — Factory function that instantiates view class per requestdispatch()routes by method — Callsget(),post(),put(),delete(), etc.- Generic views provide defaults —
ListViewpaginatesget_queryset();CreateViewhandles form GET/POST - Method overrides customize —
get_queryset(),get_context_data(),form_valid(),get_success_url() - Mixins inject behavior —
LoginRequiredMixinaddsdispatchcheck;SuccessMessageMixinadds messages
- Base
Viewclass: Implementsdispatch(),http_method_not_allowed(),options() - Generic display views:
TemplateView(render template),ListView(paginated list),DetailView(single object) - Generic editing views:
FormView(form handling),CreateView,UpdateView,DeleteView(model CRUD) - Mixin pattern:
LoginRequiredMixin,PermissionRequiredMixin,UserPassesTestMixin,SuccessMessageMixin - MRO matters: Mixin order affects method resolution;
LoginRequiredMixinbeforeViewfor auth check
- Built from: URL Dispatcher — Targets
as_view()callable - Built from: View Base Class —
django.views.Viewfoundation - Built from: Mixin Classes — Composable behavior units
- Builds into: Generic Display Views —
ListView,DetailView,TemplateView - Builds into: Generic Editing Views —
CreateView,UpdateView,DeleteView - Builds into: Method Overrides —
get_queryset,get_context_data,form_valid - Builds into: Mixin Composition — Stacking
LoginRequiredMixin, etc. - Contrasts with: Function-Based Views — Explicit vs implicit, granular vs convention
- Related: Template Rendering —
template_name,get_template_names() - Related: Form Handling —
form_class,get_form(),form_valid()
get_object()404:DetailViewcallsget_object()which raises 404; override for custom lookupsuccess_urlvsget_success_url(): Static string vs dynamic (e.g.,reverse_lazyor object method)- MRO conflicts: Multiple mixins overriding same method — order in class declaration matters
context_object_name:ListViewusesobject_list;DetailViewusesobject; customize for clarity- Form kwargs:
CreateView/UpdateViewpassinstanceto form;get_form_kwargs()for extra data