Open In App

Django Class Based Views

Last Updated : 15 May, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

Class-Based Views (CBVs) allow developers to handle HTTP requests in a structured and reusable way. With CBVs, different HTTP methods (like GET, POST) are handled as separate methods in a class, which helps with code organization and reusability.

Advantages of CBVs

  • Separation of Logic: CBVs separate different behaviors (GET, POST) into separate methods.
  • Reusable Components: Common functionality can be factored out into reusable mixins or base classes.
  • Built-in Generic Views: Django provides several built-in CBVs like CreateView, ListView, DetailView, etc., for common tasks.
crudOperations
  • CreateView - create or add new entries in a table in the database. 
  • Retrieve Views - read, retrieve, search, or view existing entries as a list(ListView) or retrieve a particular entry in detail (DetailView
  • UpdateView - update or edit existing entries in a table in the database 
  • DeleteView - delete, deactivate, or remove existing entries in a table in the database 
  • FormView - render a form to template and handle data entered by user

Django Class Based Views CRUD Operations

Illustration of How to create and use CRUD views using an example, consider a project named "geeksforgeeks" having an app named "geeks".  

Refer to the following articles to check how to create a project and an app in Django. 

Let’s now see how to implement CRUD operations using CBVs in Django.

Step 1: Define the Model

The first step is to define the model in Django. For our example, let’s create a model named GeeksModel to store the title and description of a record.

In geeks/models.py:

Python
from django.db import models
 
class GeeksModel(models.Model):

    title = models.CharField(max_length = 200)
    description = models.TextField()

    def __str__(self):
        return self.title

Explanation:

  • title: A CharField for the title of the record.
  • description: A TextField for the description of the record.

Run the following commands to create and apply database migrations:

Python manage.py makemigrations
Python manage.py migrate

Step 2: Create a ModelForm

To make it easier to create and update GeeksModel instances, let’s create a ModelForm. This form automatically generates a form for the model’s fields.

In geeks/forms.py:

Python
from django import forms
from .models import GeeksModel

class GeeksForm(forms.ModelForm):

    class Meta:
        model = GeeksModel
        fields = ["title", "description",]

Explanation:

  • GeeksForm: A form class that generates a form for GeeksModel with fields title and description

Step 3: Create Class-Based Views

CreateView (For Creating Entries)

The CreateView class-based view provides the functionality to create new database records. We will use it to add new GeeksModel entries.

In geeks/views.py:

Python
from django.views.generic.edit import CreateView
from .models import GeeksModel

class GeeksCreate(CreateView):
    model = GeeksModel
    fields = ['title', 'description']
    template_name = 'geeks/geeksmodel_form.html'
    success_url = '/'

Explanation:

  • model: Specifies the model that the view will work with.
  • fields: Specifies the fields that will be displayed on the form.
  • template_name: Points to the HTML template where the form will be rendered.
  • success_url: Defines the URL to redirect to after successfully creating a new entry.

reate the corresponding template geeks/geeksmodel_form.html:

HTML
<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
</form>

URL Mapping: In geeks/urls.py, map the GeeksCreate view:

Python
from django.urls import path
from .views import GeeksCreate

urlpatterns = [
    path('create/', GeeksCreate.as_view(), name='geeks_create'),
]

Let's check what is there on "http://localhost:8000/" 

django-create-view-function-based

To check complete implementation of Class based CreateView, visit Createview – Class Based Views Django

ListView (For Retrieving Multiple Entries)

The ListView class-based view is used to retrieve and display a list of records.

In geeks/views.py:

Python
from django.views.generic.list import ListView
from .models import GeeksModel

class GeeksList(ListView):
    model = GeeksModel
    template_name = 'geeks/geeksmodel_list.html'
    context_object_name = 'geeks_list'

Create the corresponding template geeks/geeksmodel_list.html:

HTML
<ul>
    <!-- Iterate over object_list -->
    {% for object in object_list %}
    <!-- Display Objects -->
    <li>{{ object.title }}</li>
    <li>{{ object.description }}</li>

    <hr/>
    <!-- If object_list is empty  -->
    {% empty %}
    <li>No objects yet.</li>
    {% endfor %}
</ul>

URL Mapping: In geeks/urls.py, map the GeeksList view:

Python
from django.urls import path
from .views import GeeksList

urlpatterns = [
    path('', GeeksList.as_view(), name='geeks_list'),
]

Let's check what is there on "http://localhost:8000/"

django-listview-class-based-views

To check complete implementation of Class based ListView, visit ListView – Class Based Views Django

DetailView (For Retrieving a Single Entry)

The DetailView is used to display detailed information about a single record.

In geeks/views.py:

Python
from django.views.generic.detail import DetailView

from .models import GeeksModel

class GeeksDetailView(DetailView):
    # specify the model to use
    model = GeeksModel

Now create a url path to map the view. In geeks/urls.py, 

Python
from django.urls import path

# importing views from views..py
from .views import GeeksDetailView
urlpatterns = [
    # <pk> is identification for id field,
    # slug can also be used
    path('<pk>/', GeeksDetailView.as_view()),
]

Create a template in templates/geeks/geeksmodel_detail.html, 

HTML
<h1>{{ object.title }}</h1>

<p>{{ object.description }}</p>

Let's check what is there on "http://localhost:8000/1/"

django-detailview-class-based

To check complete implementation of Class based DetailView, visit DetailView – Class Based Views Django 

UpdateView (For Updating Entries)

The UpdateView allows you to edit an existing record.

In geeks/views.py:

Python
from django.views.generic.edit import UpdateView

from .models import GeeksModel

class GeeksUpdateView(UpdateView):
    model = GeeksModel

    fields = [
        "title",
        "description"
    ]

    success_url ="/"

Now create a url path to map the view. In geeks/urls.py, 

Python
from django.urls import path

from .views import GeeksUpdateView
urlpatterns = [
    path('<pk>/update', GeeksUpdateView.as_view()),
]

Create a template in templates/geeks/geeksmodel_form.html, 

HTML
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save">
</form>

Let's check what is there on "http://localhost:8000/1/update/" 

django-updateview-class-based-view

To check complete implementation of Class based UpdateView, visit UpdateView – Class Based Views Django

DeleteView (For Deleting Entries)

The DeleteView allows you to delete a record from the database.

In geeks/views.py:

Python
from django.views.generic.edit import DeleteView
from .models import GeeksModel

class GeeksDeleteView(DeleteView):
    model = GeeksModel
    success_url ="/"

Now create a url path to map the view. In geeks/urls.py, 

Python
from django.urls import path
from .views import GeeksDeleteView
urlpatterns = [
    path('<pk>/delete/', GeeksDeleteView.as_view()),
]

Create a template in templates/geeks/geeksmodel_confirm_delete.html, 

HTML
<form method="post">{% csrf_token %}
    <p>Are you sure you want to delete "{{ object }}"?</p>
    <input type="submit" value="Confirm">
</form>

Let's check what is there on "http://localhost:8000/1/delete"

django-deleteview-class-based-views

To check complete implementation of Class based DeleteView, visit DeleteView – Class Based Views Django

FormView (For Handling Forms)

The FormView is used to display and process forms. It provides a way to handle form submissions using CBVs.

In geeks/views.py:

Python
from django.views.generic.edit import FormView
from .forms import GeeksForm

class GeeksFormView(FormView):
    form_class = GeeksForm
    template_name = "geeks / geeksmodel_form.html"
    success_url ="/thanks/"

Create a template for this view in geeks/geeksmodel_form.html, 

HTML
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save">
</form>

Map a url to this view in geeks/urls.py, 

Python
from django.urls import path
from .views import GeeksFormView
urlpatterns = [
    path('', GeeksFormView.as_view()),
]

Now visit "http://127.0.0.1:8000/"

django-create-view-function-based

To check complete implementation of Class based FormView, visit FormView – Class Based Views Django


Next Article
Practice Tags :

Similar Reads