Class-based views (CBVs) encapsulate HTTP handling in reusable classes. Django ships generics—ListView, DetailView, CreateView—that cut boilerplate for common patterns.
Generic list view
from django.views.generic import ListView
from .models import Article
class ArticleListView(ListView):
model = Article
template_name = "blog/list.html"
context_object_name = "articles"
queryset = Article.objects.filter(published=True)
When to use CBVs
- Standard CRUD with little custom logic—CreateView, UpdateView, DeleteView
- Shared mixins (LoginRequiredMixin, PermissionRequiredMixin)
- Prefer FBVs when flow is unique or readability beats abstraction
Important interview questions and answers
- Q: CBV vs FBV?
A: CBVs reuse structure and mixins; FBVs are explicit—team preference and complexity decide. - Q: as_view()?
A: CBVs exposeArticleListView.as_view()to urls.py—Django instantiates per request. - Q: Override get_queryset?
A: Customize which rows the generic view fetches without rewriting dispatch logic.
Self-check
- Which generic view lists model instances?
- When is a function-based view clearer?