简介:这是Django 4.0官方中文文档的完整离线包,面向Python Web开发者与初学者,旨在帮助学习者在无网络环境下系统掌握Django框架的核心概念与开发技能。文档内容覆盖快速入门、模型(ORM)、视图、模板、URL路由、表单、中间件、国际化与本地化、自动化测试、安全防护以及性能优化等模块,从环境搭建到项目部署均有详细说明,既适合新手循序渐进入门,也可作为中高级开发者日常查阅的手册。包内共1144个文件,以HTML网页文档和TXT文本说明为主,附有PNG图片、JavaScript、CSS等静态资源,整体约6.83MB,支持本地浏览器离线浏览与全文搜索,目录结构完整,包含索引、搜索及内置模板支持文件,便于快速定位知识点。已有2615人下载学习,非常适合需要离线查阅、系统梳理Django知识体系或进行课程备课的开发者使用;文档支持索引与搜索,内容涵盖核心概念、开发流程与最佳实践,是一份高价值的离线学习资料。 去年年底Django 4.0正式发布后,我身边不少同事的第一反应不是去打开官方文档,而是去翻博客、找视频。结果呢,很多人学到的还是2.x时代的老写法,跑起来各种报错。我劝过很多次:Django 这种文档质量在开源项目里属于顶尖水平的框架,官方中文文档本身就是最好的教材。今天这篇,我就结合自己在 Django 4.0 项目里的实际经验,把这个版本的核心变化、官方中文文档的正确打开方式,以及我平时怎么把文档查得又快又准,一次性讲清楚。适合正在学 Django 4.0 的新手,也适合准备从旧版本升级的老手。
1. Django 4.0新增了哪些值得关注的能力
1.1 先把版本节奏说清楚:4.0到底是不是LTS
Django 的发布节奏很固定:大约每 8 个月一个大版本,每三个大版本里安排一个 LTS(长期支持版)。3.2 是 LTS,4.0 不是,4.1 也不是,真正的 LTS 是 4.2。所以 4.0 更像一个“功能先行版”,很多变化会先在这里落地,然后在 4.2 这个 LTS 里稳定下来。
那为什么还要专门看 4.0?因为生产环境里大量存量项目都挂在 3.2 到 4.2 这条升级链上,而 4.0 是旧代码最容易出问题、也最能暴露兼容性风险的一个坎。如果你能顺利读透 4.0 的文档,后面升 4.2 基本就是平滑过渡。另外 4.0 要求 Python 3.8、3.9、3.10,动手之前先用python --version确认一下环境,别一上来就装。
1.2 SmartPaginator:分页器终于不是“傻白甜”
Django 自带的分页器Paginator一向简单粗暴:你给它一个查询集和每页条数,它给你生成 page 对象,模板里循环页码。但在数据量大的场景里,老版Paginator会生成一长串完整页码列表,一万页就把page_range列成一万个数字,模板渲染时直接卡住。
4.0 新增了SmartPaginator,页数超过一定数量后会自动折叠,只显示当前页附近的页码加首尾页,这对后台列表这类场景非常实用。用起来也不复杂:
from django.core.paginator import Paginator, SmartPaginator # 老写法 paginator = Paginator(queryset, per_page=10) # 4.0新写法,页数多了自动折叠 paginator = SmartPaginator(queryset, per_page=10)如果你用类视图,在ListView里指定paginator_class = SmartPaginator即可。官方文档的 API Reference 里专门列了这个类的说明,建议升级后顺手把项目里的大分页场景换成它。
1.3 zoneinfo:时区处理换引擎,别再用pytz了
Django 4.0 在时区处理上做了一次底层替换,从旧的pytz切换到 Python 3.9 标准库的zoneinfo。只要你设置了USE_TZ = True,时间转换就会走zoneinfo。这个变化对日常写timezone.now()的开发者基本无感,但如果你之前在代码里写过:
from pytz import timezone local_tz = timezone("Asia/Shanghai")升级后建议改成标准库方式:
from zoneinfo import ZoneInfo local_tz = ZoneInfo("Asia/Shanghai")另外一个容易被忽略的坑是:zoneinfo依赖系统时区数据,在某些轻量容器或 Windows 环境下可能缺少时区数据库,需要额外安装tzdata包。Django 4.0 文档的时间区章节里明确提示了这一点,部署到新环境前先确认,免得上线后时间显示全乱。
1.4 CSRF_TRUSTED_ORIGINS:格式变了,升级必踩的坑
这大概是 4.0 升级里用户报错最多的一项。以前CSRF_TRUSTED_ORIGINS里写域名就行,比如example.com;从 4.0 开始,必须带上协议头:
CSRF_TRUSTED_ORIGINS = [ "https://example.com", "http://127.0.0.1:8000", ]忘改的话,POST 请求会直接 403,而且报错信息里不会提示得很明显,前后端分离的项目尤其容易中招。这个问题在官方发布说明里被放在“不兼容变更”一栏,属于升级前必检项。
1.5 其他值得跟进的细节:密码哈希、FORM_RENDERER、管理后台
4.0 还把 PBKDF2 密码哈希的默认迭代次数从 216000 提升到了 260000,后续 4.0.x 小版本还在继续涨,这对新项目更安全,旧项目重新登录一次密码就会自动按新轮数重算。表单渲染方面,4.0 引入了FORM_RENDERER配置,想自定义表单模板的时候不用再写一堆 hack,官方 Forms 文档里专门有一节讲配置。管理后台也开放了更多导航侧边栏自定义的钩子,做后台定制的人可以看 Admin 文档。完整变化清单直接读官方“Django 4.0 release notes”页面,比任何二手博客都全。
2. 官方中文文档怎么进、怎么换版本、怎么换语言
2.1 入口和URL规则:一步到位打开中文4.0文档
官方中文文档的入口是https://docs.djangoproject.com/zh-hans/4.0/。如果你只访问docs.djangoproject.com/zh-hans/,默认会跳到当前最新正式版,可能是 4.2 或更新的版本,而不是 4.0。这个 URL 规则其实非常有规律:语言/版本/,所以你可以直接改 URL 去任意版本,不一定要用页面底部的下拉框。
我的建议是把https://docs.djangoproject.com/zh-hans/4.0/直接存为浏览器书签,日常学习固定用这个地址,避免每次都要手动切换。页脚和页内都有 Language 和 Version 的下拉选择,随时可以切换,中文文档和英文文档的 URL 只差一个en和zh-hans,对不上的时候手动替换即可。
2.2 版本锚定:为什么必须读和当前版本一致的文档
很多人不知道,Django 官方文档是按版本独立编译的。每个版本的文档只描述那个版本的状态,不会把新版本的内容混进来,也不会保留旧版本的过时写法。比如 4.0 文档里,django.utils.timezone.utc已经标为移除,但 3.2 文档里还是旧写法。你拿 3.2 的教程配 4.0 的环境跑,很容易踩空。
文档里还会用“New in Django X.X”“Changed in Django X.X”“Deprecated since X.X”这类标注,告诉你某个特性是什么时候引入或废弃的。版本锚定帮你建立“我当前用的 4.0,管它 5.0 怎么说”的边界感,排查问题时不会瞎猜。这也是我推荐大家读官方文档而不是读零散博客的核心原因——博客很少告诉你它基于哪个版本,而官方文档永远为你当前版本兜底。
2.3 中文翻译现状:可靠但有小坑
Django 官方中文文档的翻译由社区在 Transifex 平台上维护,整体质量相当高,正文的术语、示例代码基本都跟得上。它不像某些机器学习翻译那样生硬,比如QuerySet、HttpRequest这类专有名词会保留英文,读起来很顺。但要注意几个细节:小版本的 release notes 偶尔只更新英文,中文会滞后;个别“Edge case”或平台相关段落,英文原文信息更全。所以我的一般原则是:日常 API 查询用中文文档完全够用,涉及升级、新特性、平台部署时切英文原文对照看。
2.4 文档的导航结构:入门、指南、API参考三大板块
首屏最重要的部分是三大板块:入门(Getting started)包括“编写你的第一个 Django 应用”系列教程,一共七篇,从建项目到写模型、视图、模板、表单、测试、静态文件全部覆盖;指南(Using Django)是主题式教程,讲模型、查询、表单、视图、模板、数据库、测试、部署、安全、性能等;API 参考(API Reference)则是按字母和模块组织的纯参考手册,每个类、每个方法、每个配置项都有定义和示例。
新手常犯的错误是打开文档直接看 API 参考,看得一头雾水。正确路径是先把入门教程手打一遍,再按领域去指南里深入,最后在实际开发中回到 API 参考查细节。文档的“指南”里还有大量 How-to 文章,比如“如何编写自定义管理命令”“如何部署 Django”,这类文章实操性极强,很多人用了几年 Django 都不知道它们存在,非常可惜。
3. 我平时查Django文档的固定入口路径
3.1 查模型字段和Meta选项
写 model 最怕记不清字段参数的语义。我的固定路径是:首页进入 API Reference,先选 Models,再点 Model field reference 或 Field types。里面把CharField、IntegerField、DateTimeField等所有字段类型和参数列得明明白白,包括null和blank的区别、choices的格式、default是否接受 callable。另外一个高频页面是 Model Meta options,ordering、unique_together、constraints这些都在那里查,每次写复杂 Meta 我都会回去看一眼 4.0 的写法。`
3.2 查QuerySet方法
filter后面接什么条件、annotate和aggregate的差异、select_related和prefetch_related什么时候用,这类问题几乎每周都会遇到。入口是 API Reference -> Models -> QuerySet API reference。我特别推荐把annotate和aggregate的例子亲手敲一遍,因为中文术语“注释”和“聚合”很容易让人懵,但看完官方示例立刻明白。还有order_by的覆盖规则、链式调用的执行顺序,官方文档里都有清晰的说明,比在搜索引擎里翻各种帖子高效得多。
3.3 查模板标签和过滤器
写模板时,{% for %}、{% if %}、{% url %}、{% load static %}、{{ value|date:"Y-m-d" }}这类语法,我直接去 API Reference -> Templates -> Built-in template tags and filters 查。这个页面把所有内置标签和过滤器按字母排序,每个都有参数说明和示例。如果想自定义模板标签,就去指南或 How-to 里的“Custom template tags and filters”,里面的包含标签、简单标签、分配标签写得很系统。模板排错时最忌讳凭记忆硬写,过滤器参数搞错一个就全页白屏。
3.4 查配置项、类视图、中间件
记不住 settings 里某个配置的默认值和合法值,进 API Reference -> Settings 从头浏览或直接浏览器搜索。比如DATABASES、CACHES、TEMPLATES的完整写法,这里都有标准答案。类视图我习惯去 API Reference -> Class-based views,里面的 Built-in class-based views 页面把ListView、DetailView、CreateView、UpdateView等常用视图的属性、方法、上下文变量全部列出来,非常适合做增删改查页面。中间件则在 API Reference -> Middleware 里查,每个中间件的作用和配置方式一目了然。
3.5 一个通用搜索技巧
站点内搜索框对英文关键词支持不错,但中文短语有时候不准确。我的方法是直接用外部搜索,关键词写成site:docs.djangoproject.com/zh-hans/4.0/ OR site:docs.djangoproject.com/en/4.0/ 关键词,这样出来的结果基本都落在官方文档里。这个方法比在文档站内搜索快得多,也比在普通搜引擎里搜“Django 4.0 xxx”干净得多,不会被各种 SEO 垃圾帖干扰。平时我把最常用的几个文档页面放在浏览器书签文件夹里,打开速度比搜索还快。
4. 拿一个“发布列表+分页”的小例子,走通从文档到代码的闭环
4.1 model设计:从Model field reference确认字段
只讲文档结构难免抽象,我拿一个非常常见的小需求来演示完整流程:做一个新闻发布列表页,按发布时间倒序排列,每页 10 条,模板里有上一页和下一页。这个需求用官方自带能力就能做完,全程只需要打开官方文档。
先写 model。打开 Model field reference,确认CharField必须传max_length,DateTimeField可以设置auto_now_add=True,创建记录时自动填当前时间。Meta.ordering = ["-created_at"]让查询默认按时间倒序。文档里对这几个参数的说明非常精确,照着写就行:
from django.db import models class Post(models.Model): title = models.CharField(max_length=100) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) class Meta: ordering = ["-created_at"]4.2 视图:用ListView和SmartPaginator实现分页
视图部分最省事的方案是ListView。打开 Built-in class-based views 页面,找到ListView的说明,确认它支持model、template_name、paginate_by、context_object_name这些属性。paginate_by = 10一填,分页能力立刻就有。按前面说的方法显式指定SmartPaginator,数据量大了也不怕:
from django.core.paginator import SmartPaginator from django.views.generic import ListView from .models import Post class PostListView(ListView): model = Post template_name = "posts/list.html" context_object_name = "posts" paginate_by = 10 paginator_class = SmartPaginator这个写法的依据全在官方文档里:ListView的属性在类视图文档,SmartPaginator的说明在 Pagination 页面。把文档翻到对应位置,你会发现每个配置项的作用都被描述得很清楚,不需要靠猜。
4.3 模板:用page_obj完成翻页输出
ListView启用分页后,模板上下文里会自动多一个page_obj对象。翻页按钮的标准写法官方示例里有,你只需要把内联样式换成自己的页面样式即可:
{% for post in posts %} <h2>{{ post.title }}</h2> <p>{{ post.content }}</p> {% empty %} <p>暂无内容</p> {% endfor %} {% if page_obj.has_previous %} <a href="?page={{ page_obj.previous_page_number }}">上一页</a> {% endif %} <span>第 {{ page_obj.number }} / {{ page_obj.paginator.num_pages }} 页</span> {% if page_obj.has_next %} <a href="?page={{ page_obj.next_page_number }}">下一页</a> {% endif %}page_obj.has_previous、page_obj.previous_page_number、page_obj.next_page_number、page_obj.paginator.num_pages这些变量在类视图文档的“分页”小节里都有明确说明。我第一次写分页时也是对着文档一个个抄的,抄完再理解,比背十个第三方分页插件的 API 都管用。
4.4 跑通并验证
最后把应用注册到INSTALLED_APPS,在项目的urls.py里配好路由:
from django.urls import path from posts.views import PostListView urlpatterns = [ path("posts/", PostListView.as_view(), name="post_list"), ]先把几条测试数据插进去,然后python manage.py runserver,访问/posts/,第 10 条之后应该出现“上一页”“下一页”按钮。整个流程从 model 到视图到模板,我只打开了官方中文文档,没有打开任何第三方教程。这种“文档即教材”的体验,正是 Django 官方文档做得好的地方。
5. 中文译文不是万能的:这些场景我建议切回英文原文
5.1 新版本发布说明和升级日志
官方中文文档的常规页面更新确实及时,但发布说明(Release notes)这种文档,尤其是小版本的 bugfix 列表,经常只有英文版更新到最新,中文版可能会滞后一两个版本。所以每次升级 Django 小版本,我都直接看英文原文的 release notes,对照“Backwards incompatible changes”一节逐条检查自己项目有没有踩雷。日常开发中查 API 用中文没问题,但升级前请务必看英文原文。
5.2 概念理解:中英对照反而更快
Django 有些术语翻译后反而增加理解成本。比如annotate被译为“注释”,aggregate被译为“聚合”,prefetch_related被译为“预取相关”,第一次接触的人很难从中文名联想到 API 的用途。我的习惯是遇到这类概念先看英文原文的标题和示例代码,再回头对比中文文档的解释。Django 文档的 URL 切换只需要换一个en或zh-hans,中英对照成本极低。不要觉得切换语言丢人,能快速理解底层概念才是重点。
5.3 平台相关细节:Windows部署、zoneinfo依赖
平台相关内容也是英文版更新更快。比如前面提到的zoneinfo在 Windows 上需要额外安装tzdata包,中文文档里虽然写了,但对应的依赖说明和排查段落英文版更详尽。部署章节涉及 Nginx、Gunicorn、Daphne 的部分,英文版的命令示例和配置说明也往往更完整。遇到部署报错且中文文档没有直接答案时,不用迟疑,直接切到英文版同页面对比。
5.4 文档是开源项目:欢迎参与翻译和纠正
很多人不知道,Django 官方文档本身就是一个开源项目,中文翻译由社区持续维护。你看到某个标注有翻译不准确或滞后,完全可以去 Django 的 GitHub 仓库(django/django)找到对应 docs 文件提交 PR,或者在 Transifex 上申请成为翻译贡献者。这种参与不仅能帮到后来者,你自己提交 PR 的过程中对文档的理解也会深一层。我认识几个在翻译团队里待过一段时间的朋友,他们对 Django 的熟悉程度,比看一百遍文档的人强得多。
最后分享一个我自己的带人习惯。新人来了我不会立刻塞视频课或买来的教程,而是让他们把官方教程第 1 篇到第 7 篇完整手打一遍,然后从第二天开始,遇到问题必须先去https://docs.djangoproject.com/zh-hans/4.0/查文档,查完了再来问我。三个月下来,他们对 Django 的理解普遍比那些只看博客、搜问答的人扎实很多。文档不仅是参考手册,它本身就是一套完整的项目教程,尤其是 Django 这种文档质量在开源社区里数一数二的项目。如果你刚进入 Django 4.0 这个版本,把书签固定好,把教程过一遍,遇到问题先问文档,你的成长速度会比想象中快不少。
本文还有配套的精品资源,点击获取