SyntaxStudy
Sign Up
Django Function-Based Views (FBV)
Django Beginner 1 min read

Function-Based Views (FBV)

Function-based views (FBVs) are the simplest way to write views in Django. A view is just a Python function that accepts an HttpRequest object and returns an HttpResponse. FBVs are easy to read and reason about because control flow is explicit — you can see exactly what happens for each HTTP method by checking request.method. Django provides several shortcuts that make FBVs concise. The render() shortcut combines loading a template and returning an HttpResponse in one call. The get_object_or_404() shortcut retrieves a model instance by primary key (or any lookup) and automatically raises a 404 error if it doesn't exist, eliminating boilerplate exception handling. The @login_required decorator is commonly used with FBVs to protect views that require authentication. Similarly, the @require_http_methods or @require_POST decorators restrict a view to specific HTTP methods, returning a 405 Method Not Allowed response for any other method. These decorators compose cleanly and keep view functions focused on business logic.
Example
# blog/views.py — function-based views
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST
from django.contrib import messages
from .models import Post
from .forms import CommentForm


def post_list(request):
    """Display a paginated list of published posts."""
    from django.core.paginator import Paginator
    queryset = Post.published.select_related('author').order_by('-published_at')
    paginator = Paginator(queryset, 10)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'blog/post_list.html', {'page_obj': page_obj})


def post_detail(request, pk):
    """Display a single post and its comment form."""
    post = get_object_or_404(Post.published, pk=pk)
    form = CommentForm()
    return render(request, 'blog/post_detail.html', {'post': post, 'form': form})


@login_required
def post_create(request):
    """Create a new post (authenticated users only)."""
    from .forms import PostForm
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            messages.success(request, 'Post created successfully.')
            return redirect('post-detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'blog/post_form.html', {'form': form})


@login_required
@require_POST
def post_delete(request, pk):
    """Delete a post (POST only, owner only)."""
    post = get_object_or_404(Post, pk=pk, author=request.user)
    post.delete()
    messages.success(request, 'Post deleted.')
    return redirect('post-list')