Django
Beginner
1 min read
Function-Based Views (FBV)
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')
Related Resources
Django Reference
Complete tag & property list
Django How-To Guides
Step-by-step practical guides
Django Exercises
Practice what you've learned
More in Django