Django Lesson 4: Views & URLs
Views are Python functions (or classes) that handle requests and return responses. URLs map URL patterns to view functions.
Function-Based Views
# posts/views.py
from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse
from .models import Post
def post_list(request):
posts = Post.objects.filter(status="published")
return render(request, "posts/list.html", {"posts": posts})
def post_detail(request, slug):
post = get_object_or_404(Post, slug=slug, status="published")
return render(request, "posts/detail.html", {"post": post})
def api_posts(request):
posts = Post.objects.values("id", "title", "created_at")
return JsonResponse(list(posts), safe=False)
URL Routing
# posts/urls.py
from django.urls import path
from . import views
urlpatterns = [
path("", views.post_list, name="post-list"),
path("<slug:slug>/", views.post_detail, name="post-detail"),
path("api/posts/", views.api_posts),
]
# myblog/urls.py (root)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("posts/", include("posts.urls")),
]
🏋️ Practice Task
Create views for your task manager: task_list (all tasks, filter by ?project=id), task_detail (single task by id), api_tasks (return JSON). Wire up URLs. Test in browser: /tasks/, /tasks/1/, /tasks/api/.
💡 Hint: Use request.GET.get(“project”) to check if filter is present. tasks = Task.objects.filter(project_id=proj_id) if proj_id else Task.objects.all()