全书目录

第十四篇:Django 完全指南 —— 中央行政城区宇宙

第四章:View —— 真正办事的窗口

1 分钟 311 字 第 278 / 962 个阅读单元

路由只负责“把人领到窗口”。

真正处理请求的,是 View。

先写三个最基本的窗口:

py
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render

from .models import Permit

def index(request):
    permits = Permit.objects.order_by("-created_at")[:20]
    return render(request, "permits/index.html", {"permits": permits})

def detail(request, pk):
    permit = get_object_or_404(Permit, pk=pk)
    return render(request, "permits/detail.html", {"permit": permit})

def healthcheck(request):
    return HttpResponse("central district is running")

一个 View 的职责很朴素:

  • 收到 request
  • 取参数
  • 调业务
  • 查数据
  • 返回响应

你可以把它想成窗口职员:

text
市民提交请求
    │
    ▼
窗口职员读取资料(request)
    │
    ├── 看 URL 参数
    ├── 看查询参数
    ├── 看表单数据
    ├── 看登录用户
    └── 看请求方法 GET / POST
    ▼
决定下一步
    │
    ├── render 模板
    ├── redirect 重定向
    ├── 返回 JSON
    └── 抛 404 / 403

实际开发时,View 最容易犯的错是变成“超级窗口”:

  • 一边做参数解析
  • 一边写大段业务判断
  • 一边拼数据库查询
  • 一边决定页面展示细节

这样写一阵子,窗口就会变成垃圾堆。

稳妥原则是:

  • View 负责调度
  • 复杂查询放到模型方法、管理器或服务层
  • 展示逻辑放模板
  • 输入校验放表单
  • 权限控制放认证/权限层

如果你刚开始学 Django,先把函数视图吃透。类视图当然很强,但先把“窗口在干什么”理解清楚,比一上来套继承体系更重要。