4.1 视图的本质
Django 的视图是一个可调用对象,接收 HttpRequest,返回 HttpResponse。两种主流写法:函数视图(FBV)与类视图(CBV)。
- FBV(Function-Based View)
- 函数视图,最直白:一个函数处理一个请求。逻辑一目了然,适合简单或高度定制的页面。
- CBV(Class-Based View)
- 类视图,用类的方法(get/post)分派 HTTP 动词,可继承复用。适合结构化的增删改查页面。
- HttpRequest
- 请求对象,封装
request.GET/request.POST/request.method/request.user/request.FILES等。 - HttpResponse
- 响应对象,可返回文本、HTML、JSON(
JsonResponse)、重定向(redirect)或渲染模板(render)。 - 通用视图(Generic View)
- Django 内置的 CBV,如
ListView/DetailView/CreateView,封装了列表、详情、表单等常见模式。 - 装饰器(Decorator)
- 包裹视图函数增强行为,如
@login_required、@require_POST、@cache_page。 - as_view()
- 类视图挂载到 URLconf 时的入口,把类转成可调用视图函数。
4.2 函数视图 FBV
# blog/views.py
from django.shortcuts import render, get_object_or_404
from .models import Post
def post_list(request):
posts = Post.objects.filter(published=True)
return render(request, "blog/list.html", {"posts": posts})
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, "blog/detail.html", {"post": post})
三个常用快捷函数
render(渲染模板并返回响应)、redirect(重定向)、get_object_or_404(取不到就返回 404,替代裸 get)——90% 的视图靠这三件套。
4.3 类视图 CBV
from django.views import View
from django.shortcuts import render
class PostListView(View):
def get(self, request):
posts = Post.objects.all()
return render(request, "blog/list.html", {"posts": posts})
def post(self, request):
# 处理表单提交...
...
挂载到 URLconf 时调用 as_view():
path("", PostListView.as_view(), name="list"),
4.4 通用视图:一行搞定列表与详情
from django.views.generic import ListView, DetailView
class PostList(ListView):
model = Post
template_name = "blog/list.html"
context_object_name = "posts"
paginate_by = 10 # 自动分页
def get_queryset(self):
return Post.objects.filter(published=True)
class PostDetail(DetailView):
model = Post
template_name = "blog/detail.html"
context_object_name = "post"
| 通用视图 | 用途 |
|---|---|
| ListView | 对象列表 + 内置分页 |
| DetailView | 单对象详情 |
| CreateView | 创建表单 |
| UpdateView | 编辑表单 |
| DeleteView | 删除确认 |
| TemplateView | 纯模板渲染 |
4.5 request 对象常用属性
def demo(request):
request.method # "GET" / "POST"
request.GET.get("q") # 查询参数 ?q=xxx
request.POST.get("title") # 表单字段
request.user # 当前登录用户
request.FILES # 上传的文件
request.session # 会话字典
4.6 返回 JSON 与重定向
from django.http import JsonResponse
from django.shortcuts import redirect
def api_stats(request):
return JsonResponse({"total": Post.objects.count()})
def create(request):
# ...保存后重定向到命名 URL
return redirect("blog:list")
4.7 视图装饰器与 CBV Mixin
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST
@login_required
@require_POST
def publish(request, pk):
...
# CBV 用 Mixin
from django.contrib.auth.mixins import LoginRequiredMixin
class Dashboard(LoginRequiredMixin, ListView):
model = Post
4.8 小结与下一步
- 视图是「request → response」的逻辑核心,FBV 直白、CBV 可复用。
- 通用视图
ListView/DetailView几行完成列表详情,还自带分页。 render/redirect/get_object_or_404是日常三件套;用装饰器/Mixin 加权限与限制。- 下一章进入 Template——把视图传来的数据渲染成 HTML。