Class Based Views - potatoscript/django GitHub Wiki

🧠 Class-Based Views – A Smarter Way to Build

Imagine you’re building with LEGO bricks. Function-Based Views (FBVs) are like building from scratch every time 🧱
Class-Based Views (CBVs) are like prebuilt LEGO sets β€” faster, cleaner, and easier to reuse! 🧰✨


πŸ†š Function-Based View vs Class-Based View

πŸ”§ Function-Based View (FBV)

def hello_view(request):
    return HttpResponse("Hello!")

πŸ‘‘ Class-Based View (CBV)

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

class HelloView(View):
    def get(self, request):
        return HttpResponse("Hello!")

➑️ In your urls.py:

from django.urls import path
from .views import HelloView

urlpatterns = [
    path('hello/', HelloView.as_view(), name='hello'),
]

πŸ“Œ as_view() turns your class into a usable view!


πŸ’Ό Why Use Class-Based Views?

Benefit Explanation
βœ… Reusable You can inherit and extend views
βœ… Organized Separate logic by HTTP methods (GET, POST...)
βœ… Shorter Code Prebuilt views do the heavy lifting
βœ… Easier to maintain Especially for big projects πŸ—οΈ

🧱 CBV Structure

class MyView(View):
    def get(self, request):
        # handle GET requests
    def post(self, request):
        # handle POST requests

πŸ“¦ Step-by-Step: Display a Page with CBV

β‘  Create View

from django.views import View
from django.shortcuts import render

class HomePageView(View):
    def get(self, request):
        return render(request, 'home.html')

β‘‘ Set URL

path('', HomePageView.as_view(), name='home'),

β‘’ Create Template

πŸ“„ templates/home.html

<h1>🏑 Welcome to the Home Page!</h1>
<p>This is rendered using a Class-Based View.</p>

✨ Built-In CBVs – No Need to Reinvent the Wheel

CBV What It Does
TemplateView Just show a template
ListView Show a list of things from the DB
DetailView Show details about one thing
CreateView Form to create a new thing
UpdateView Form to update a thing
DeleteView Confirm then delete a thing

πŸ–ΌοΈ TemplateView – The Simplest One

from django.views.generic import TemplateView

class AboutView(TemplateView):
    template_name = 'about.html'
# urls.py
path('about/', AboutView.as_view(), name='about'),

πŸ’‘ No need to define get() β€” it’s already built in!


πŸ“ƒ ListView – Show a List of Items

Let’s say you have this model:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

Now show all posts:

from django.views.generic import ListView
from .models import Post

class PostListView(ListView):
    model = Post
    template_name = 'posts.html'
    context_object_name = 'posts'

posts.html

<h1>πŸ“ Blog Posts</h1>
<ul>
  {% for post in posts %}
    <li>{{ post.title }}</li>
  {% endfor %}
</ul>

πŸ” DetailView – Show One Item

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

class PostDetailView(DetailView):
    model = Post
    template_name = 'post_detail.html'

URL:

path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),

Template:

<h2>{{ object.title }}</h2>
<p>{{ object.content }}</p>

πŸ”‘ pk is the post’s primary key (ID)


βž• CreateView – Let Users Add Data

from django.views.generic.edit import CreateView
from .models import Post
from django.urls import reverse_lazy

class PostCreateView(CreateView):
    model = Post
    fields = ['title', 'content']
    template_name = 'post_form.html'
    success_url = reverse_lazy('home')

πŸ’Ύ reverse_lazy() = safely redirect after saving

Template:

<h2>πŸ†• New Post</h2>
<form method="post">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit">Create</button>
</form>

πŸ”„ UpdateView / DeleteView

Same pattern:

from django.views.generic.edit import UpdateView, DeleteView

class PostUpdateView(UpdateView):
    model = Post
    fields = ['title', 'content']
    template_name = 'post_form.html'
    success_url = reverse_lazy('home')

class PostDeleteView(DeleteView):
    model = Post
    template_name = 'post_confirm_delete.html'
    success_url = reverse_lazy('home')

🎯 Summary Table

View Purpose Base Class
Show page TemplateView
List stuff ListView
Detail DetailView
Create CreateView
Update UpdateView
Delete DeleteView

πŸ“˜ Example Project Menu

URL View
/ HomePageView
/about/ AboutView
/posts/ PostListView
/post/1/ PostDetailView
/create/ PostCreateView
/post/1/edit/ PostUpdateView
/post/1/delete/ PostDeleteView

⚠️ **GitHub.com Fallback** ⚠️