Understanding Django’s Class-Based Views

Understanding Django’s Class-Based Views

Shahmir Khan
4 min readJan 7, 2025

Django provides a robust set of class-based views (CBVs) to simplify common web development patterns. These views encapsulate logic for rendering templates, handling forms, and managing CRUD operations. Understanding when to use each CBV can streamline your development process and improve code readability.

1. View

When to Use

Use View as a base class when none of the specialized CBVs meet your needs. It allows you to handle HTTP methods like GET, POST, etc., manually.

Scenario

You want to create a custom view that performs specific logic before rendering a response.

Example

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

class CustomView(View):
def get(self, request, *args, **kwargs):
return HttpResponse("This is a GET request response")

def post(self, request, *args, **kwargs):
return HttpResponse("This is a POST request response")

URL Configuration:

from django.urls import path
from .views import CustomView

urlpatterns = [
path('custom/', CustomView.as_view(), name='custom_view'),
]

2. TemplateView

When to Use

Use TemplateView when you need to render a simple static template without requiring any additional context or database queries.

Scenario

You want to display a “Contact Us” page with static information like your company’s address and email.

Example

from django.views.generic import TemplateView

class ContactUsView(TemplateView):
template_name = "contact_us.html"

URL Configuration:

from django.urls import path
from .views import ContactUsView

urlpatterns = [
path('contact-us/', ContactUsView.as_view(), name='contact_us'),
]

3. ListView

When to Use

Use ListView when you need to display a list of objects from a database model.

Scenario

You want to display a list of feedback on the blog post whose rating is greater than 03 on your website’s homepage.

Example

class ReviewsListView(ListView):
template_name = 'reviews/review_list.html'
model = Review # This will automatically fetch all the reviews from the database and pass it to the template
context_object_name = 'reviews' # This will pass the reviews list to the template with the name 'reviews'

def get_queryset(self):
base_query = super().get_queryset()
data = base_query.filter(ratings__gt=3)
return data

URL Configuration:

from django.urls import path
from . import views

urlpatterns = [
path("reviews", views.ReviewsListView.as_view(), name='reviews'),
]

4. DetailView

When to Use

Use DetailView when you need to display detailed information about a single object.

Scenario

You want to show the full details of a blog post when a user clicks on it.

Example

from django.views.generic import DetailView
from .models import BlogPost

class BlogPostDetailView(DetailView):
model = BlogPost
template_name = "blog_post_detail.html"
context_object_name = "post"

URL Configuration:

from django.urls import path
from . import views

urlpatterns = [
path('post/<int:pk>/', views.BlogPostDetailView.as_view(), name='blog_post_detail'),
]

5. FormView

When to Use

Use FormView when you need to handle a custom form that isn’t tied directly to a model.

Scenario

You want to create a newsletter subscription form.

Example

from django.views.generic.edit import FormView
from .forms import NewsletterForm

class NewsletterFormView(FormView):
template_name = "newsletter_form.html"
form_class = NewsletterForm
success_url = "/thank-you/"

def form_valid(self, form):
# Handle form processing here
form.save()
return super().form_valid(form)

URL Configuration:

from django.urls import path
from . import views

urlpatterns = [
path('subscribe/', views.NewsletterFormView.as_view(), name='newsletter_form'),
]

6. CreateView

When to Use

Use CreateView to create new objects tied to a model using a form.

Scenario

You want to allow users to submit new blog posts.

Example

from django.views.generic.edit import CreateView
from .models import BlogPost

class BlogPostCreateView(CreateView):
model = BlogPost
fields = ['title', 'content']
# form_class = BlogPostForm # BlogPostForm must be a model form
template_name = "blog_post_form.html"
success_url = "/"

URL Configuration:

from django.urls import path
from . import views

urlpatterns = [
path('post/new/', views.BlogPostCreateView.as_view(), name='blog_post_create'),
]

7. UpdateView

When to Use

Use UpdateView to update existing objects tied to a model using a form.

Scenario

You want to allow users to edit their blog posts.

Example

from django.views.generic.edit import UpdateView
from .models import BlogPost

class BlogPostUpdateView(UpdateView):
model = BlogPost
fields = ['title', 'content']
template_name = "blog_post_form.html"
success_url = "/"

URL Configuration:

from django.urls import path
from . import views

urlpatterns = [
path('post/<int:pk>/edit/', BlogPostUpdateView.as_view(), name='blog_post_update'),
]

8. DeleteView

When to Use

Use DeleteView to delete objects from a model.

Scenario

You want to allow users to delete their blog posts.

Example

from django.views.generic.edit import DeleteView
from .models import BlogPost

class BlogPostDeleteView(DeleteView):
model = BlogPost
template_name = "blog_post_confirm_delete.html"
success_url = "/"

URL Configuration:

from django.urls import path
from . import views

urlpatterns = [
path('post/<int:pk>/delete/', views.BlogPostDeleteView.as_view(), name='blog_post_delete'),
]

Conclusion

Django’s class-based views provide reusable, maintainable, and powerful tools for handling common web application patterns. Selecting the right CBV based on your requirements can save time and simplify your code. Whether you need to display static pages, handle forms, or manage CRUD operations, Django’s CBVs have you covered.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Shahmir Khan
Shahmir Khan

Written by Shahmir Khan

Shahmir Khan have 5+ years of software development experience. He knows Javascript, PHP, ReactJS, NodeJS, VueJS and Laravel.

No responses yet

Write a response