Labs ICT
โญ Pro Login

Generic Views

Built-in views for common patterns.

Why Generic Views?

Most web applications follow the same patterns. You list objects, show details, create new items, edit existing ones, and delete them. Writing a view for each of these from scratch gets repetitive fast. Django's generic views solve this by providing pre-built views for common patterns.

Instead of writing the same boilerplate code over and over, you tell the generic view which model and template to use, and it handles the rest. Less code, fewer bugs, more productivity.

ListView and DetailView

ListView displays a list of objects. DetailView shows a single object's details. Both require you to specify a model and template.


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

class PostListView(ListView):
    model = Post
    template_name = 'blog/post_list.html'
    context_object_name = 'posts'
    paginate_by = 10

class PostDetailView(DetailView):
    model = Post
    template_name = 'blog/post_detail.html'
    context_object_name = 'post'
    

The context_object_name sets the variable name available in your template. paginate_by adds pagination automatically โ€” no extra code needed.

Try it Yourself โ†’

CreateView, UpdateView, and DeleteView

These views handle forms for creating, editing, and deleting objects. They work with your model forms and handle validation, saving, and redirecting automatically.


from django.views.generic import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Post

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

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

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

reverse_lazy() is used instead of reverse() because URL configuration might not be loaded yet when the class is defined.

TemplateView and RedirectView

TemplateView renders a template without any model logic. It's perfect for static pages like "About" or "Contact". RedirectView sends users to another URL.


from django.views.generic import TemplateView, RedirectView

class AboutView(TemplateView):
    template_name = 'about.html'

class HomeRedirectView(RedirectView):
    url = '/blog/'
    permanent = False
    

TemplateView is great when you don't need to fetch data from the database. It just renders the template and returns it. RedirectView is useful for short URLs or temporary redirects.

๐Ÿงช Quick Quiz

What is the benefit of Django's generic views?