Chapter 04

视图 View:FBV 与 CBV

视图是「请求进、响应出」的业务逻辑核心。掌握函数视图与类视图两种写法,并用通用视图消灭样板代码。

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 小结与下一步