Generic Class-Based Views for CRUD
Django's generic views provide ready-made CRUD operations — ListView, DetailView, CreateView, UpdateView, DeleteView. They handle common patterns with minimal code, reducing boilerplate and following Django conventions.
20 min•By Priygop Team•Updated 2026
Generic CRUD Views
- ListView — List objects with pagination
- DetailView — Display single object
- CreateView — Form to create new object
- UpdateView — Form to edit existing object
- DeleteView — Confirm and delete object
- All generic views need model and template_name
- CreateView/UpdateView need fields or form_class
- DeleteView needs success_url
Generic Views CRUD
Generic Views CRUD
# blog/views.py
# from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
# from django.urls import reverse_lazy
# from django.contrib.auth.mixins import LoginRequiredMixin
# from .models import Post
# List all posts
# class PostListView(ListView):
# model = Post
# template_name = 'blog/list.html'
# context_object_name = 'posts'
# paginate_by = 10
# Single post detail
# class PostDetailView(DetailView):
# model = Post
# template_name = 'blog/detail.html'
# Create new post
# class PostCreateView(LoginRequiredMixin, CreateView):
# model = Post
# fields = ['title', 'content', 'category', 'tags']
# template_name = 'blog/form.html'
# def form_valid(self, form):
# form.instance.author = self.request.user
# return super().form_valid(form)
# Update post
# class PostUpdateView(LoginRequiredMixin, UpdateView):
# model = Post
# fields = ['title', 'content', 'category', 'tags']
# template_name = 'blog/form.html'
# Delete post
# class PostDeleteView(LoginRequiredMixin, DeleteView):
# model = Post
# template_name = 'blog/confirm_delete.html'
# success_url = reverse_lazy('blog:list')
# blog/urls.py
# urlpatterns = [
# path('', PostListView.as_view(), name='list'),
# path('<int:pk>/', PostDetailView.as_view(), name='detail'),
# path('create/', PostCreateView.as_view(), name='create'),
# path('<int:pk>/edit/', PostUpdateView.as_view(), name='update'),
# path('<int:pk>/delete/', PostDeleteView.as_view(), name='delete'),
# ]Tip
Tip
Use form.save(commit=False) when you need to modify the object before saving (e.g., setting the author from request.user).
Diagram
Loading diagram…
QuerySets are LAZY — no DB hit until evaluated.
Common Mistake
Warning
Calling form.save() without checking form.is_valid() first. Always validate before saving to the database.
Practice Task
Note
(1) Use commit=False to set author. (2) Save with form.save(). (3) Add success message with Django messages.
Quick Quiz
Key Takeaways
- Django's generic views provide ready-made CRUD operations — ListView, DetailView, CreateView, UpdateView, DeleteView.
- ListView — List objects with pagination
- DetailView — Display single object
- CreateView — Form to create new object