课程
Django 是广泛使用的免费、开源且高级的 Web 开发框架。它为开发者提供了大量“开箱即用”的功能,因此开发速度很快。同时,基于它构建的网站也能兼顾安全性、可扩展性和可维护性。
目标
本教程的目标是构建一个博客应用,博客内容可通过管理后台创建和更新。博客内容会显示在页面上,并可按需删除。整个应用提供 CRUD(Create、Read、Update、Delete)功能。
本教程不使用任何前端技术(如 JavaScript、CSS 等),而是专注于每个 Django Web 开发都必需的基础概念。
准备工作
- Git Bash: 适用于所有操作系统。所有与 Django 相关的命令和部分 Unix 命令都通过它执行。下载 Git Bash:点此下载。
- 文本编辑器: 可使用任意文本编辑器,如 Sublime Text 或 Visual Studio Code。以下项目中使用 Sublime Text。
- Python 3: 可在 Download Python 下载最新版本的 Python。
注意: 如果您理解 Python 基础并了解循环、函数、类等,以及具备一些 bash 或命令行知识,便可轻松跟随本教程。
虚拟环境
虚拟环境为与 Python 相关的项目提供依赖隔离。它相当于一个自包含的容器或隔离环境,在其中为某个特定项目安装所有 Python 相关包及其所需版本。由于 Python、Django 或其他包会不断发布新版本,通过虚拟环境,您可以在同一台电脑上针对不同项目使用各自所需的旧版本。总之,您可以在同一电脑上独立开展一个基于 Django 2.0 的项目,同时又独立启动另一个基于 Django 3.0 的项目。
注意: 创建虚拟环境的方法有多种,下面仅展示其中一种。
创建虚拟环境的步骤
- 您可以在桌面使用 “mkdir” 命令创建名为 “project-blog” 的新目录。
-
使用 “cd” 命令将目录切换到 “project-blog”。

-
使用 “python -m venv env” 创建虚拟环境,其中 env 是我们的虚拟环境,可通过 “ls” 命令看到。

-
激活虚拟环境: 使用 “source” 命令激活虚拟环境,需要启用或激活 “Scripts” 文件夹。

成功激活虚拟环境后,父括号中会显示 “env”。 - 安装 Django: 使用 “pip install django” 在您的特定虚拟环境中安装 Django。

注意:Linux 和 Mac 用户需要在命令中明确使用 “python3”,因为其电脑通常已预装 Python 2 版本。此外,建议现在使用 Python 3,因为 Python 自 2020 年后不再支持 2.x 版本。
创建 Django 项目
- 第一步是使用 “django-admin startproject
project_name” 创建项目,此处的 “project_name” 为 “django_blog”。该命令会在新建项目中生成许多文件,必要时您可以在 Django 文档 中进一步查阅。
- 使用 “cd” 命令切换到新创建的项目目录,用 “ls” 命令查看生成的文件。

- 您可以使用 “python manage.py runserver” 运行项目。

- 可在您常用的浏览器(Google Chrome、Mozilla Firefox 等)中查看项目。在地址栏输入 “localhost:8000” 或 “127.0.0.1:8000”,如下所示。

注意: 要显示与上图相同的页面,需要确保 bash 中的服务器在后台运行。您也可以按需手动停止服务器:Windows/Linux 使用 “Ctrl+C”,Mac 使用 “Cmd+C”。
启动新的 Django 项目
在 Django 中创建新项目通常是两步流程,如下所示。
- 第一步使用 “python manage.py startapp
app_name” 创建应用,此处 app_name 为 “blog”。在 Django 中,一个项目可以包含多个应用,每个应用为该项目提供单一且特定的功能。
- 第二步是在 “django_blog/settings.py” 的 INSTALLED_APP 部分进行修改,让项目识别我们新创建的应用。

修改模型
Django 默认使用 “SQLite” 作为数据库,它轻量且适用于小型项目,本项目使用它完全足够。Django 使用 “对象关系映射(ORM)”,使得与数据库交互非常容易。我们不直接编写数据库操作代码,而是通过在 “models.py” 中使用 “class” 关键字来创建数据库表。
在 “blog/models.py” 中,您需要创建一个名为 “Post” 的新模型。该类将随后成为数据库表,当前继承自 “models.Model”。在标准博客中,每篇 “Post” 包含一个标题,对应字段为 CharField。 它是基于文本的列,且必须提供参数 “max_length”,此处为 50。此外还有一个名为 “content” 的字段,为 TextField,用于存放 “Post” 的详细文本内容,符合常见博客的结构。定义了双下划线(str)方法,用于覆盖并返回字段 “title” 的实际名称,而不是某个对象表示。 
创建迁移
“python manage.py makemigrations” 是第一步,它会在创建后读取 “models.py”。该命令会创建一个名为 “migrations” 的新文件夹,其中有一个名为 “0001_initial.py” 的文件,并且可跨数据库移植。 
迁移到数据库
第二步使用 “python manage.py migrate”,它会读取新创建的 “migrations” 文件夹并创建数据库,当模型发生变化时也会相应地演进数据库。 
注册到管理后台
进入 “blog/admin.py”,通过 “from .models import Post” 导入名为 “Post” 的模型。要将模型注册到管理后台,使用命令 “admin.site.register(Post)”。

创建超级用户并在管理后台查看
在访问 “admin” 面板之前,您需要创建一个超级用户。使用 “winpty python manage.py createsuperuser”。 
注意:winpty 是 bash 特定命令,用于与 Windows 控制台程序通信。
在 bash 中使用命令 python manage.py runserver 在后台运行服务器。打开浏览器并在地址栏输入以下内容。 
随后填写您之前创建的用户名和密码: 
之后即可在管理后台看到我们新创建的 “Post” 模型。 
点击 “Add” 按钮更改 “Post” 的内容。填写信息并 “Save” 保存。 
修改 views 和 urls
前往 “blog/views.py”,按下图进行修改。添加函数 “blog_list”,它接收请求。通过查询 “Post.objects.all()” 获取所有已创建的对象,并保存到 post。新建一个字典 “context”,将对象作为键传给模板 “blog-list.html”,并通过 render 返回响应。 
在 “django_blog/blog” 中新建文件 “urls.py” 并进行如下修改。相对导入视图 “blog_list”,以及一个 “urlpatterns”,它是通往网站特定页面的路径列表。目前,<b'path' 包含空字符串和视图名称。 
接着前往 “django_blog/urls.py”,导入 include 并修改 “urlpatterns”。然后通过 include 添加应用的 URL 路径。当用户访问 “posts/” 时,会被导向我们的 “blog.urls”。
创建并修改模板
创建一个 templates 文件夹,通常用来存放 “HTML”,并包含其自有的模板语言 “Jinja2”。按照约定,文件夹路径应为 “templates/blog/blog_list.html”。 
如下所示,包含与 “超文本标记语言(HTML)” 相关的语法,其中 “h1” 表示大标题,无序列表(ul)包含列表项 li。同时使用了与 “Jinja2” 相关的 “for” 循环语法,从 “blog/views.py” 传来的键 “blog_list” 会被迭代为各元素 “list”。 
在网页上查看标题为 “First Post” 的内容。 
从管理后台以同样方式再添加一条信息,将第二篇文章的 title 命名为 “Second Post”。 
添加信息并刷新首页后,页面会更新显示。 
每篇文章的详情页
您将为每篇文章创建单独页面,包含文章标题及其内容。该 “url” 为 “localhost:8000/posts/‘id’”,其中 id 表示附加在每篇 “Post” 上的唯一编号或主键,由 Django 自动提供。
在 “blog/view.py” 中创建函数 “blog_detail”,它接受 id 作为参数。同时发起查询以获取指定 id,并保存为 “each_post”。与上文类似,将所需信息作为 context 传给 “blog_detail.html”。 
修改 “blog/urls.py” 中的 url,其中 path 包含 “<id>”,以整型形式接收唯一 id。假设用户仅访问 “posts/” 时,会看到所有文章;当访问 “posts/1” 时,只会看到第一篇创建的文章的信息。 
新建文件 “blog/blog_detail.html” 并进行如下修改。由于 blog_detail 作为 context 传入,可使用点号访问 “title” 和 “content”。 
在浏览器地址栏输入相应 URL 来查看单篇文章。由于第一条信息的 “id” 为 “1”,第二条为 “2”,后续依次递增。 
删除文章
定义 blog_delete,它接收请求和 id。通过查询 “Post.objects.get(id=id)” 获取具有唯一 id 的对象并保存为 each_post。随后调用 “each_post.delete()” 删除该 “Post”。最后从 “django.http” 模块导入 HttpResponseRedirect,用于将页面重定向到 “/posts/”。 
在 “urls.py” 中导入 “blog_delete”,并将路径设置为 “<id>/delete”,这样在 id 后加上 delete 即可删除对应对象或信息。 
我们通过在 “urls.py” 中输入如下路径来删除文章。 
最后,当调用 “posts/1/delete/” 时,页面会重定向到 “/posts”,此时首页仅剩一篇文章。 
结语
恭喜您完成本教程!您已经学习了 Django Web 开发的基础,并了解了 CRUD 功能。若想在某个具体主题上了解更多,请前往 Django 文档。
参考资料:
Python 中的 Django Web 开发常见问题
什么是 Django?
Django 是一个用 Python 编写的免费开源 Web 框架,遵循模型-模板-视图(MTV)架构模式。其设计旨在帮助开发者尽可能快速地将应用从概念落地到上线。
Django 有哪些特性?
Django 的一些特性包括轻量且模块化的设计、强大的 ORM(对象关系映射)以简化数据库交互,以及对常见 Web 开发任务的内置支持,如用户认证与管理、表单处理和内容管理。
如何开始使用 Django?
要开始使用 Django,您需要在本机安装 Python 和 Django 库。然后可以使用 django-admin startproject 命令创建一个新的 Django 项目,并利用 Django 的内置功能和工具开始构建您的应用。
如何在 Django 中创建数据库?
Django 默认使用随 Python 附带的 SQLite 数据库引擎。您可以在 Django 应用中定义模型并运行 migrate 命令来创建新数据库。这会在数据库中创建用于存储模型数据的必要数据表。
如何在 Django 中创建视图和模板?
在 Django 中,视图是处理 HTTP 请求并返回 HTTP 响应的函数。您可以在 Django 应用中定义接收请求并返回响应的函数来创建视图。模板是包含动态内容占位符的 HTML 文件。您可以使用 Django 的模板语言在模板中插入动态内容,并在视图中进行渲染。
如何部署 Django 应用?
部署 Django 应用有多种方式,取决于您的托管需求和偏好。常见选项包括部署到 Heroku 或 AWS 等云平台、使用 Apache 或 Nginx 等 Web 服务器,或使用 PythonAnywhere、DigitalOcean 等托管服务。