尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Django入门核心主线:URL、视图、模型、模板四步打通

Django入门核心主线:URL、视图、模型、模板四步打通 学习 Django 框架时很多新手不是被 Python 语法难住而是被 Django 自身庞大的概念体系绕晕模型、视图、模板、URL 路由、中间件、Admin、DRF、信号、缓存、迁移……如果一上来就想把所有模块都搞懂很容易在学到中间件时崩溃最后连一个能显示数据的页面都写不出来。这篇文章想帮你抓住一条贯穿初学期的主线请求如何进来数据如何出去。只要把 URL、视图、模型、模板这四个环节串起来Django 的入门就能变得非常顺后面再补其他功能也只是在这条主线上挂东西。1. 初学 Django 最大的陷阱被概念淹没而不是被逻辑困住1.1 Django 的本质一个处理 HTTP 请求的框架从使用者的角度看Django 是一个用 Python 编写的 Web 框架目标是帮助开发者快速搭建 Web 应用。它自带 Admin 后台、ORM、认证系统、模板引擎、表单处理等常见组件很多中小型项目直接用它就能完成从后台到前端的整套方案。但新手拿到这个描述后往往会陷入两种极端一种是觉得 Django 什么都能干于是想一次性学完所有功能另一种是被一堆专业名词吓到连startproject之后生成的目录结构都不敢动。实际上Django 处理问题的核心逻辑非常集中接收浏览器发来的 HTTP 请求解析 URL执行对应的 Python 代码操作数据库产生一段 HTTP 响应返回给浏览器。剩下的一切都是围绕这个闭环提供便利。要理解这一点先不要关心 Django 有多少个内置组件先看一个请求从浏览器发出后在 Django 内部走的是哪些环节。这一步清楚了后面所有代码才有落点。1.2 一条主线的四个环节URL、View、Model、TemplateDjango 的入门主线可以拆成四个环节URL 路由决定当前浏览器的地址应该由哪一段 Python 代码处理。View 视图真正写业务逻辑的地方。视图可以读取请求参数、查询数据库、做计算最后返回响应。Model 模型负责和数据库打交道。一个表对应一个模型类查询、新增、删除、修改都通过模型完成。Template 模板负责把数据渲染成 HTML。前端页面在这里组合变量、循环列表、做条件判断。这条主线跑通后你已经能写出一个非常典型的 Django 功能用户访问/articles/视图查询数据库中的文章列表模板把列表渲染成 HTML浏览器展示出来。浏览器请求 URL - Django 匹配 URL 路由 - 调用对应的 View 视图函数 - 视图通过 Model 操作数据库 - 视图把数据传给 Template 模板 - 模板渲染成 HTML - Django 返回 HTTP 响应给浏览器不用记住太多细节只需要在心里留一个印象Django 不是我写一个 Python 脚本然后让用户去运行。而是在服务器上常驻一个服务这个服务不断接收请求然后根据 URL 把请求分流给不同代码处理。1.3 为什么掌握主线比学习所有功能更重要Django 的文档和教程数量非常多且很多资料一上来就讲 DRF、中间件、Django REST Framework、异步任务、Docker 部署等进阶话题。这些内容不是不好而是不适合放在入门第一步。原因在于如果连“一个请求进来后代码是怎么被调用的”都不清楚遇到报错时连日志该看哪一段都不知道。而主线思维能带来三个很实际的好处遇到报错时能快速定位404 一般是 URL 或视图返回值的问题500 一般是视图代码或模板语法问题数据库报错一般是模型或迁移的问题。学习新功能时有归位感Session、缓存、用户认证、分页、Admin 等都是在这条主线某个环节上做增强而不是脱离主线的新世界。写项目时有骨架拿到需求后先拆 URL、再写视图、再建模、再套模板而不是一上来就纠结用什么技术方案。2. 先把环境准备好Python 版本、虚拟环境和 Django 安装2.1 学习环境的版本要求在开始之前先明确这套环境的最低要求。这里不写死某个版本号因为 Python 和 Django 的版本更新非常频繁不同教程对应的版本差异很大。落地时以你自己安装到的版本为准命令和 API 大多数情况下是兼容的但有些细节可能会有变化。环境项建议要求说明操作系统Windows 10/11、macOS、主流 Linux 发行版Django 是跨平台框架学习阶段不影响PythonPython 3.8 以上Django 3.2 以后逐步放弃旧版本建议直接安装当前稳定 3.xpip随 Python 自带用于安装 Django数据库学习阶段使用 SQLiteDjango 默认配置即可无需额外安装前端能力了解基础 HTML 即可模板语法不需要你先精通 JS/CSS这里特别提醒一句不要为了追求“最新”而去使用 Alpha 或者 Beta 版本尤其不要一上来就安装最新的 dev 版本。Django 项目本身很讲究稳定性教程和第三方插件通常滞后于大版本发布。学习阶段选择正式发布的稳定版本遇到问题能搜到的资料最多。2.2 创建虚拟环境并安装 Django实际项目开发中强烈建议不要直接把 Django 安装到系统全局 Python 环境里。否则多个项目依赖不同版本的 Django 时会产生互相覆盖的冲突。虚拟环境的作用就是为每个项目隔离出一套独立的 Python 包环境。在项目目录下打开终端执行创建虚拟环境的命令python3 -m venv venvWindows 下如果python3命令不可用可以试pythonpython -m venv venv创建成功后项目目录下会出现一个venv文件夹。接下来激活虚拟环境# macOS / Linux source venv/bin/activate # Windows PowerShell venv\Scripts\activate # Windows CMD venv\Scripts\activate.bat激活后终端提示符前面通常会多出一个(venv)前缀说明现在使用的 Python 解释器和 pip 都来自虚拟环境。接着安装 Djangopip install django如果你想安装指定版本可以这样写pip install django4.2.*安装完成后验证是否成功python -m django --version如果能输出一个版本号说明 Django 已经安装成功。这里用python -m django而不是django-admin是为了确保执行的命令确实来自当前虚拟环境避免混淆系统环境中的旧版本。注意网络环境或镜像源不同可能会导致安装缓慢。国内用户可以把 pip 源切换到国内镜像但这个过程只影响下载速度不影响 Django 的 API 用法。2.3 Django 安装后的命令工具Django 安装成功后会提供几个关键命令。新手必须分清这两个命令的用途django-admin startproject创建整个 Django 项目的基础目录结构。python manage.py runserver在项目目录下启动开发服务器。django-admin是全局工具创建项目后大多数日常操作都应该聚焦到项目目录下的manage.py。manage.py本质上是django-admin的封装它会自动使用当前项目的配置所以进入项目目录后执行命令时优先使用python manage.py。学习阶段要养成一个好习惯每次打开终端后第一件事是激活虚拟环境第二件事是确认当前目录是项目目录。很多新手遇到No module named django或manage.py找不到的报错都是因为环境或目录不对。2.4 搞清楚学习环境和生产环境的差异很多教程默认你是在自己的电脑上写代码、启动服务、用浏览器访问。这套流程非常适合学习但和生产环境的差距很大。建议初学者心里先有一张环境差异对照表维度学习环境生产环境服务器本机runserverLinux 服务器Web 服务Django 自带开发服务器Nginx Gunicorn/uWSGI数据库SQLitePostgreSQL/MySQL代码更新修改后自动重载或手动重启需要重新拉取代码并重启服务静态文件Django 自动处理交给 Nginx 处理调试信息页面显示完整异常信息关闭DEBUG记录日志安全配置使用默认配置即可需要配置ALLOWED_HOSTS、HTTPS、密钥管理等这个表格不需要现在全部消化但要知道开发阶段你能看到浏览器上的完整报错页面生产环境一定不能这样配置。文章后面会再回到生产环境的部署注意点。3. 创建最小项目先看懂每个文件3.1 用 startproject 创建项目骨架激活虚拟环境后进入你想存放代码的目录执行django-admin startproject myblog这时会生成一个名为myblog的目录。进入这个目录后你看到的文件结构大致如下myblog/ manage.py myblog/ __init__.py settings.py urls.py asgi.py wsgi.py新手要重点关注三个文件manage.py项目管理的入口运行服务器、迁移数据库、创建 app 都靠它。settings.py整个项目的配置中心数据库、应用注册、模板路径、语言时区都在这里。urls.pyURL 路由配置的入口文件浏览器访问什么地址由这里决定分发给哪个视图。asgi.py和wsgi.py是部署到服务器时给 ASGI/WSGI 服务器用的接口文件学习阶段暂时不用动。创建项目后先不要急着改代码直接启动开发服务器把环境先跑通cd myblog python manage.py runserver正常情况下终端会输出类似下面的信息System check identified no issues. Django version X.Y.Z, using settings myblog.settings Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.浏览器访问http://127.0.0.1:8000/会看到 Django 默认的欢迎页面说明项目已经能跑起来了。3.2 创建第一个 app理解“项目”和“应用”的关系很多新手对 Django 的“项目”和“应用”概念非常混乱。简单理解项目是整套网站比如“我的博客”。应用是网站里的一个功能模块比如“文章管理”“用户评论”“友情链接”。一个项目里可以有很多个应用每个应用负责一类相对独立的功能。这样拆分的好处是代码边界清晰复用性好。以后从一个项目复制一个应用到另一个项目也能相对容易。创建文章应用python manage.py startapp articles执行后项目目录下会出现一个articles文件夹包含models.py、views.py、admin.py、apps.py、migrations/等重要文件。此时需要在settings.py中注册这个应用否则 Django 不会加载它。打开myblog/settings.py在INSTALLED_APPS列表中加入articles.apps.ArticlesConfigINSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, articles.apps.ArticlesConfig, ]Django 初始化 app 时apps.py里会自动生成一个配置类配置类的名字就是app名 Config。手动注册时可以写成articlesDjango 也能自动找到默认配置但显式写出配置类更规范。注意忘记在INSTALLED_APPS中注册 app是新手高频错误之一。表现为创建了模型执行makemigrations后却提示“No changes detected”或者admin.py里的注册始终不生效。3.3 settings.py 中要先改的三个位置打开settings.py后先不要通读全部内容只需要关注几个关键配置项。第一个是ALLOWED_HOSTS。学习阶段可以暂时留空但如果你想用手机在同一局域网访问开发服务器或者部署到服务器测试就需要把它设置成允许的域名或 IPALLOWED_HOSTS []第二个是语言和时区。Django 默认语言是英文时区是 UTC。改成中文和国内时区后Admin 后台和表单时间显示会友好很多LANGUAGE_CODE zh-hans TIME_ZONE Asia/Shanghai USE_TZ True第三个是DATABASES。默认配置使用 SQLite学习和测试阶段不需要改动DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: BASE_DIR / db.sqlite3, } }之后切换 MySQL 或 PostgreSQL 时只需要替换ENGINE和补充USER、PASSWORD、HOST、PORT等参数即可模型代码完全不用变。这是 Django ORM 带来的便利点之一。3.4 第一次数据库迁移把 Django 自带的数据表建出来Django 不是一个完全不用建表的框架。它自带的 Admin、认证、Session 功能都需要数据库表。执行以下两个命令python manage.py makemigrations python manage.py migratemakemigrations的作用是根据模型生成迁移文件migrate的作用是把迁移文件同步到数据库。第一次执行migrate时会在 SQLite 数据库中创建 Django 内置功能所需的表例如认证用户表、权限表、Session 表。完成迁移后可以用python manage.py showmigrations查看迁移状态也可以打开项目目录检查是否生成了db.sqlite3文件。到这一步项目的最基本骨架已经完整。4. 用模型建立数据结构理解 ORM 的价值4.1 用 Article 模型理解数据库表如何映射成 Python 类Django 的 Model 本质上是 Python 类和数据库表之间的映射关系。每写一个类对应数据库里一个表类的每个属性对应该表的一个字段。在articles/models.py中写一个最简单的文章模型from django.db import models class Article(models.Model): title models.CharField(max_length200) content models.TextField() created_at models.DateTimeField(auto_now_addTrue) updated_at models.DateTimeField(auto_nowTrue) def __str__(self): return self.title这段代码定义了一个Article类包含标题、内容、创建时间、更新时间四个字段。其中CharField短文本字段必须指定max_length。TextField长文本字段适合文章正文。DateTimeField日期时间字段。auto_now_addTrue表示第一次创建时自动写入当前时间auto_nowTrue表示每次保存时自动更新。新手很容易搞混auto_now_add和auto_now。记住一个口诀auto_now_add是创建时间auto_now是更新时间。__str__方法非常实用。它决定了当你在 Admin 后台或 shell 中打印这个对象时显示的是对象的标题而不是一段看不出内容的内存地址。4.2 生成迁移并同步到数据库模型写好之后必须要生成迁移文件并执行同步python manage.py makemigrations articles python manage.py migrate第一条命令执行后articles/migrations/目录下会出现一个类似0001_initial.py的文件。这个文件就是数据库变更的“版本记录”。第二条命令会真正在数据库里创建articles_article表。新手最容易在这里犯的错误是修改了模型后没执行迁移然后程序报错说“no such column”。记住模型改动和数据库同步不是自动进行的路径是修改 models.py - makemigrations - migrate缺一步都不行。4.3 注册到 Admin 后台快速获得数据管理界面Django Admin 是新手学习时的好帮手它能帮你快速录入、修改、删除数据省去自己写管理界面的时间。在articles/admin.py中注册模型from django.contrib import admin from .models import Article admin.register(Article) class ArticleAdmin(admin.ModelAdmin): list_display [id, title, created_at, updated_at] search_fields [title]代码说明admin.register(Article)是注册装饰器比admin.site.register(Article)更清晰。list_display控制后台列表页显示哪些字段。search_fields让后台列表页支持按标题搜索。然后创建超级管理员账号python manage.py createsuperuser按照提示输入用户名、邮箱、密码。注意密码输入时终端不会显示任何字符这是正常现象。创建完成后启动服务器访问http://127.0.0.1:8000/admin/用刚才创建的账号登录就能看到“文章”的管理入口。进入文章页点右上角“增加”随便录入几篇文章数据。这步操作的价值是后续写视图、模板时不需要手工在数据库里插入数据直接在后台点击录入即可效率高很多。4.4 用 shell 验证 ORM 的增删改查为了确保模型和数据库连接正常可以在 Django shell 中直接验证 ORM 的基本操作。执行python manage.py shell然后逐行输入from articles.models import Article # 查询所有文章 Article.objects.all() # 新增一篇文章 Article.objects.create(titleDjango 入门第一课, content文章内容) # 根据主键查找 article Article.objects.get(id1) # 修改字段 article.title 新的标题 article.save() # 删除对象 article.delete()这些操作非常直观objects是模型默认的管理器。all()返回全部记录。create()直接创建并保存记录等价于先实例化再save()。get()按条件查找如果匹配到多条记录会报错所以主键查询时常用。delete()删除记录。学到这里你已经能完成“建表、插入、修改、删除、查询”这套数据库基本操作而这些操作都不需要直接写 SQL。这就是 ORM 最核心的价值用 Python 对象操作数据库降低开发成本。5. 跑通 URL - View - Template 主链路5.1 视图层先写最普通的函数视图视图是这条主线里业务逻辑最集中的地方。Django 支持函数视图和类视图。新手阶段函数视图更容易理解建议先把函数视图写熟。在articles/views.py中先写一个最简单的视图from django.http import HttpResponse def index(request): return HttpResponse(文章列表页面)这个视图不查询数据库、不使用模板只返回一段普通文本。它验证的核心问题是URL 到视图的调用链路是否通。然后配置 URL 路由。先修改项目根目录的myblog/urls.py把应用的 URL 配置引入from django.contrib import admin from django.urls import path, include urlpatterns [ path(admin/, admin.site.urls), path(, include(articles.urls)), ]注意原来只有admin/这一行现在加了一行path(, include(articles.urls))。include的作用是把所有以空字符串开头的请求转发给articles应用自己的urls.py去处理。然后在articles应用目录下新建urls.pyfrom django.urls import path from . import views urlpatterns [ path(, views.index, namearticle_list), ]启动服务器访问http://127.0.0.1:8000/浏览器会显示“文章列表页面”。到这里第一个完整链路已经跑通浏览器请求根路径 - 项目根urls.py转发给应用 - 应用urls.py匹配空路径 - 调用index视图 - 返回响应。5.2 视图查询数据库并把数据传给模板接下来把模型查询加进视图。修改articles/views.pyfrom django.shortcuts import render from .models import Article def article_list(request): articles Article.objects.all().order_by(-created_at) return render(request, articles/article_list.html, {articles: articles})代码解释Article.objects.all()查询所有文章。order_by(-created_at)按创建时间倒序排列。render是 Django 提供的快捷函数它会加载模板、传入上下文数据、渲染 HTML最后返回一个 HttpResponse。这里出现了一个重要约定渲染模板时模板文件路径是articles/article_list.html。默认情况下Django 会在每个 app 目录下查找templates文件夹所以你应该在articles目录下创建articles/ templates/ articles/ article_list.html为什么在templates下还要再套一层articles目录因为如果多个 app 里都存在index.htmlDjango 的模板加载器可能分不清该用哪一个。套一层应用名命名的目录可以避免同名模板冲突。这是 Django 社区的标准做法新手一定要养成这个习惯。5.3 编写模板学会读取变量和循环列表模板是 Django 把业务数据转成 HTML 的地方。在articles/templates/articles/article_list.html中写以下内容!DOCTYPE html html langzh-cn head meta charsetUTF-8 title文章列表/title /head body h1文章列表/h1 ul {% for article in articles %} li a href#{{ article.title }}/a p{{ article.created_at }}/p /li {% empty %} li暂无文章/li {% endfor %} /ul /body /html模板语法三个最核心的部分{% for article in articles %}循环遍历列表用{% endfor %}结束。{{ article.title }}输出变量的值。{% empty %}是for循环的扩展语法当列表为空时展示括号里的内容。此时访问http://127.0.0.1:8000/如果数据库中已经有文章页面会显示文章标题和创建时间如果没有页面会显示“暂无文章”。这个页面虽然简陋但它证明了整个主链路已经打通URL 路由 - 视图查询数据库 - 模板渲染循环列表 - 返回 HTML。这就是 Django 最常见的业务形态。5.4 增加详情页理解 URL 参数传递列表页只是第一步。现实中用户点击一篇文章标题应该进入文章详情页。这需要视图接收 URL 里的参数。先在articles/urls.py中增加详情页路由from django.urls import path from . import views urlpatterns [ path(, views.article_list, namearticle_list), path(int:article_id/, views.article_detail, namearticle_detail), ]int:article_id是 Django 的路径转换器它会把 URL 中的这段内容转换成整数并作为article_id参数传给视图。继续修改articles/views.pyfrom django.shortcuts import render, get_object_or_404 from .models import Article def article_detail(request, article_id): article get_object_or_404(Article, pkarticle_id) return render(request, articles/article_detail.html, {article: article})get_object_or_404是一个很常用的快捷方式如果能查询到对象就返回对象如果查不到直接返回 404 页面。这比手动查询然后判断if not article更简洁也避免了 500 错误。创建详情页模板articles/templates/articles/article_detail.html!DOCTYPE html html langzh-cn head meta charsetUTF-8 title{{ article.title }}/title /head body h1{{ article.title }}/h1 p{{ article.created_at }}/p div{{ article.content }}/div pa href{% url article_list %}返回列表/a/p /body /html这里新增了两个知识点{{ article.created_at }}在模板中直接输出日期时间字段和输出普通字段写法一样因为 Django 的模型对象可以自动调用字段值。{% url article_list %}是反向解析 URL。它根据urls.py中定义的namearticle_list自动生成对应的 URL 路径。这样即使以后路径变了模板里也不用改。最后回到列表模板把标题的href#改成详情页地址a href{% url article_detail article.id %}{{ article.title }}/a到这里你已经完成了列表页和详情页两套完整的页面逻辑。这个流程覆盖了 URL 参数、ORM 查询、模板继承之外的几个核心基础能力。注意article.id是主键值路由里写的参数名是article_id这两者可以不一致因为 Django 是按位置和解包后的参数名传给视图函数的。但为了可读性和一致性建议变量名尽可能统一。6. 新手最容易踩的坑与排查顺序6.1 常见问题速查表结合日常带新人的经验以下这些问题几乎每周都会出现问题现象常见原因检查位置浏览器访问出现 404URL 路由没有匹配或者 app 未在INSTALLED_APPS注册urls.py、settings.py页面显示 500 Internal Server Error视图代码异常、模板语法错误、数据库查询报错终端日志、浏览器 Debug 页面修改模型后数据库没有新字段忘记执行makemigrations或migrate迁移文件、数据库表结构模板找不到模板文件路径错误、模板目录名错误templates目录、文件层级Admin 后台没有新注册的模型未在admin.py注册或 app 未加入INSTALLED_APPSadmin.py、settings.py修改代码后页面没变化开发服务器没有自动重载终端是否输出Reloading...手动重启静态文件或图片不显示静态文件配置、URL 配置、权限问题settings.py、模板加载方式中文字符显示乱码数据库表编码、模板charset、连接字符集模板meta charset、数据库配置这张表可以作为排查起点。出现问题时不要先怀疑 Django 有 Bug先按表格从上到下检查自己的代码和配置。6.2 修改模型后没有同步数据库这是最容易被忽略的坑。很多新手在模型中加了一个字段然后发现页面上取不到这个字段或者报错说no such column原因就是只改了models.py没有执行迁移。正确流程python manage.py makemigrations articles python manage.py migrate如果运行makemigrations时提示No changes detected需要检查模型是否真的修改过或者 app 是否真的注册成功。另外多个 app 并存时建议执行makemigrations时带上 app 名避免生成其他应用的意外迁移。6.3 模板路径错误导致无法加载模板新手常见的模板文件结构错误如下articles/ templates/ article_list.html # 错误缺少应用名子目录这会导致render(request, articles/article_list.html, ...)找不到文件。正确结构应该是articles/ templates/ articles/ article_list.html原因在于render函数里的模板路径是相对templates根目录的而不是相对应用目录的。所以路径写成articles/article_list.html时它会在templates目录下寻找articles/article_list.html这个路径而不是去articles应用目录下直接找article_list.html。养成按应用名建子目录的习惯可以避免和未来其他应用的模板冲突。6.4 时区设置后时间仍然不对如果在settings.py中设置了LANGUAGE_CODE zh-hans和TIME_ZONE Asia/Shanghai但 Admin 中显示的时间仍然是 UTC这通常是数据库里已经存入了 UTC 时间模板展示时没有做时区转换。学习阶段如果你不依赖 UTC 时间做跨时区逻辑可以直接把USE_TZ设置为FalseUSE_TZ False这样数据库会保存本地时间展示时和TIME_ZONE保持一致。但在生产环境尤其是面向多个时区用户的系统建议把数据以 UTC 存储展示时再转换成用户本地时区。新手不需要过度纠结先保证能看到正确的本地时间即可。6.5 如何从日志反推链路问题Django 的报错信息已经很友好。开发模式下浏览器会显示一个黄色或灰色的错误页面包含异常类型、堆栈信息、请求头、模板上下文等。排查时按顺序看以下几点异常类型和异常信息比如TemplateDoesNotExist、FieldError、OperationalError。堆栈信息里出现你自己写的代码的位置优先看你自己写的那几行而不是框架内部的调用。请求方式和 URL确认确实是你要访问的那个地址。如果错误页面没有提供完整信息回到终端看runserver输出的日志通常会有更详细的堆栈。日志的排查顺序也可以归纳成一条链路URL 是否能匹配 - 视图是否被调用 - 视图内哪行代码报错 - 数据库查询是否异常 - 模板渲染是否异常只要沿着这条链路找大部分问题都能在两三分钟内定位。6.6 关于“为什么 Django 不像普通脚本那样直接运行”还有一个很容易让新手困惑的问题为什么我不能直接python myapp.py运行整个项目原因是 Django 是长期运行的 Web 服务它需要在进程内初始化数据库连接、加载 URL 配置、注册应用、创建日志对象等。manage.py中的runserver命令做的事情就是完成这些初始化然后启动一个 HTTP 服务器持续监听请求。所以当你想让项目“跑起来”时运行的是python manage.py runserver当你想执行某个独立脚本时需要先通过 Django shell 或自定义management command进入项目环境才能访问模型和配置。理解了这一点就不会再把manage.py和普通 Python 脚本混淆了。7. 抓住主线之后下一步学习路径7.1 表格学完主线后再挂什么扩展主链路跑通后可以开始往这条主干上挂新的能力。以下表格可以帮助安排学习顺序学习阶段学习内容挂在主线的哪个环节挑战程度第一阶段模板继承、条件判断、链接反向解析Template 层低第二阶段表单处理、数据校验、用户登录注册View Model 层中第三阶段Django Admin 深度定制、搜索、筛选Admin 层中第四阶段类视图、通用视图、分页View 层中第五阶段Django REST Framework写 APIURL View Model 层中高第六阶段缓存、Redis、Celery 异步任务View 层后的性能优化高第七阶段Nginx Gunicorn 部署上线整个项目高从第一阶段开始你会发现主线思维的价值新增功能时先问“这个功能属于哪个环节”再决定改models.py、views.py还是模板文件。7.2 表单和用户认证第一批应该掌握的进阶功能学完模板渲染后第一个值得投入时间的方向是 Django 表单系统和用户认证。Django 的表单能自动渲染 HTML、验证数据、处理错误信息和模型结合时能省去大量重复代码。用户认证则是几乎所有 Web 应用都需要的功能登录、登出、注册、重置密码。这两个方向可以基于你已经掌握的模型和视图知识自然延伸。写一个最简单的登录页时你会接触到django.contrib.auth、authenticate、login、logout这些模块和函数它们的作用逻辑都是一样的接收请求、验证用户、写入 Session、返回响应。只要记住主线这一层的学习不会太难。7.3 生产环境部署不要等学完所有功能再开始很多新手把部署留到“把 Django 学完”之后结果一部署就遇到各种环境问题。其实部署越早越好。一个只包含列表页和详情页的最小项目完全可以用一台 Linux 服务器完成部署。部署时需要关注的点包括关闭DEBUG并设置ALLOWED_HOSTS。使用 Gunicorn 或 uWSGI 启动 Django 应用。用 Nginx 转发请求并处理静态文件。配置环境变量存放密钥、数据库连接信息。使用 PostgreSQL 替代 SQLite或者至少做好 SQLite 的备份策略。这些内容不需要立刻全部做但推荐在学会一个完整功能之后尝试把项目部署到服务器上。部署过程中遇到的所有问题都会极大加深你对 Django 的理解。7.4 推荐给新手的三条练习建议练习一做一个自己的“留言板”。支持用户提交内容、页面显示所有留言、后台管理删除。这个项目覆盖了表单、模型、列表展示、Admin 定制四个核心模块是巩固主线的最佳练习。练习二把博客项目改成“带分类和标签”的版本。新增分类模型、标签模型文章和它们建立外键或多对多关系然后实现按分类筛选文章。这个练习会让你开始理解数据库关系设计也是 Django 中比较重要的进阶内容。练习三写一个简单的“待办事项”应用。支持增加、标记完成、删除。这个项目虽然小但正好能锻炼从需求到模型再到视图和模板的完整闭环。三条练习的共同点核心都是 URL - View - Model - Template 这条主线。功能可以不断叠加但骨架永远不变。这也是 Django 对新手最友好的地方只要抓住这条主线后续学习的每一个功能都只是在这条线上增加新的分支而已。
返回列表