01第一章_创建博客应用
02第二章_增强博客功能
03第三章_扩展博客功能
04第四章_创建社交网站
05第五章_内容分享功能
06第六章_追踪用户行为
07第七章_创建电商网站
08第八章_管理支付与订单
09第九章_扩展商店功能
10第十章_创建在线教育平台
11第十一章_学生注册和选课、运用缓存框架
12第十二章_在线教育平台–-RESTful API
13第十三章_上线_–_柚子小站
第一章第一章 创建博客应用
创建博客应用
欢迎来到Django 2 by example的教程。你看到的是目前全网唯一翻译该书的教程。
本书将介绍如何创建可以用于生产环境的完整Django项目。如果你还没有安装Django,本章在第一部分中
将介绍如何安装Django,之后的内容还包括创建一个简单的博客应用。本章的目的是让读者对Django的整
体运行有一个概念,理解Django的各个组件如何交互运作,知道创建一个应用的基础方法。本书将指导你
创建一个个完整的项目,但不会对所有细节进行详细阐述,Django各个组件的内容会在全书的各个部分内
进行解释。
本章的主要内容有:
安装Django并创建第一个项目
设计数据模型和进行模型迁移(migrations)
为数据模型创建管理后台
使用QuerySet和模型管理器
创建视图、模板和URLs
给列表功能的视图添加分页功能
使用基于类的视图
1 安装安装Django
如果已经安装了Django,可以跳过本部分到 创建第一个Django项目 小节。Django是Python的一个包(模
块),所以可以安装在任何Python环境。如果还没有安装Django,本节是一个用于本地开发的快速安装
Django指南。
Django 2.0需要Python解释器的版本为3.4或更高。在本书中,采用Python 3.6.5版本,如果使用Linux或者
macOS X,系统中也许已经安装Python(部分Liunx发行版初始安装Python2.7),对于Windows系统,
从 https://www.python.org/downloads/windows/ 下载Python安装包。
译者在此强烈建议使用基于UNIX的系统进行开发。
如果不确定系统中是否已经安装了Python,可以尝试在系统命令行中输入 python 然后查看输出结果,如果
看到类似下列信息,则说明Python已经安装:
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 03:03:55)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
如果安装的版本低于3.4,或者没有安装Python,从 https://www.python.org/downloads/ 下载并安装。
由于我们使用Python 3,所以暂时不需要安装数据库,因为Python 3自带一个轻量级的SQLite3数据库可以
用于Django开发。如果打算在生产环境中部署Django项目,需要使用更高级的数据库,比如
PostgreSQL,MySQL或者Oracle数据库。关于如何在Django中使用数据库,可以看官方文
档 https://docs.djangoproject.com/en/2.0/topics/install/#database-installation 。
译者注:在翻译本书和实验代码的时候,译者的开发环境是Centos 7.5 1804 + Python 3.7.0 + Django
2.1.0(最后一章升级到Django 2.1.2),除了后文会提到的一个旧版本第三方库插件冲突的问题之外,未
发现任何兼容性问题。
1.1 创建独立的
创建独立的Python开发环境
开发环境
推荐使用 virtualenv 创建独立的开发环境,这样可以对不同的项目应用不同版本的模块,比将这些模块直
接安装为系统Python的第三方库要灵活很多。另一个使用 virtualenv 的优点是安装Python模块的时候不需
要任何管理员权限。在系统命令行中输入如下命令来安装 virtualenv :
pip install virtualenv
在安装完 virtualenv 之后,通过以下命令创建一个独立环境:
virtualenv my_env
译者注:需要将virtualenv 的所在路径添加到系统环境变量PATH 中,对于Django也是如此,不然无法直
接执行django-admin 命令。
这个命令会在当前目录下创建一个 my_env/ 目录,其中放着一个Python虚拟环境。在虚拟环境中安装的
Python包实际会被安装到 my_env/lib/python3.6/site-packages 目录中。
如果操作系统中安装的是Python 2.X,必须再安装Python 3.X,还需要设置 virtualenv 虚拟Python 3.X的
环境。
可以通过如下命令查找Python 3的安装路径,然后创建虚拟环境:
zenx$ which python3
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
zenx$ virtualenv my_env -p /Library/Frameworks/Python.framework/Versions/3.6/bin/python3
根据Linux发行版的不同,上边的代码也会有所不同。在创建了虚拟环境对应的目录之后,使用如下命令激
活虚拟环境:
source my_env/bin/activate
激活之后,在命令行模式的提示符前会显示括号包住该虚拟环境的名称,如下所示:
(my_env)laptop:~ zenx$
开启虚拟环境后,随时可以通过在命令行中输入 deactivate 来退出虚拟环境。
关于 virtualenv 的更多内容可以查看 https://virtualenv.pypa.io/en/latest/ 。
virtualenvwrapper 这个工具可以方便的创建和管理系统中的所有虚拟环境,需要在系统中先安
装 virtualenv ,可以到 https://virtualenvwrapper.readthedocs.io/en/latest/ 下载。
1.2 使用使用PIP安装安装Django
推荐使用 pip 包安装Django。Python 3.6已经预装了 pip ,也可以
在 https://pip.pypa.io/en/stable/installing/ 找到 pip 的安装指南。
使用下边的命令安装Django:
pip install Django==2.0.5
译者这里安装的是2.1版。
Django会被安装到虚拟环境下的 site-packages/ 目录中。
现在可以检查Django是否已经成功安装,在系统命令行模式运行 python ,然后导入Django,检查版本,
如下:
>>> import django
>>> django.get_version()
'2.0.5'
如果看到了这个输出,就说明Django已经成功安装了。
Django的其他安装方式,可以查看官方文档完整的安装指
南: https://docs.djangoproject.com/en/2.0/topics/install/ 。
2 创建第一个
创建第一个Django项目项目
本书的第一个项目是创建一个完整的博客项目。Django提供了一个创建项目并且初始化其中目录结构和文
件的命令,在命令行模式中输入:
django-admin startproject mysite
这会创建一个项目,名称叫做 mysite 。
避免使用Python或Django的内置名称作为项目名称。
看一下项目目录的结构:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
这些文件解释如下:
manage.py :是一个命令行工具,可以通过这个文件管理项目。其实是一个 django-admin.py 的包装器,这个文
件在创建项目过程中不需要编辑。
mysite/ :这是项目目录,由以下文件组成:
__init__.py :一个空文件,告诉Python将 mysite 看成一个包。
settings.py :这是当前项目的设置文件,包含一些初始设置
urls.py :这是 URL patterns 的所在地,其中的每一行URL,表示URL地址与视图的一对一映射关系。
wsgi.py :这是自动生成的当前项目的WSGI程序,用于将项目作为一个WSGI程序启动。
自动生成的 settings.py 是当前项目的配置文件,包含一个用于使用SQLite 3 数据库的设置,以及一个叫
做 INSTALLED_APPS 的列表。 INSTALLED_APPS 包含Django默认添加到一个新项目中的所有应用。
在之后的 项目设置 部分会接触到这些应用。
为了完成项目创建,还必须在数据库里创建起 INSTALLED_APPS 中的应用所需的数据表,打开系统命令
行输入下列命令:
cd mysite
python manage.py migrate
会看到如下输出:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
这些输出表示Django刚刚执行的数据库迁移(migrate)工作,在数据库中创建了这些应用所需的数据
表。在本章的 创建和执行迁移 部分会详细介绍 migrate 命令。
2.1 运行开发中的站点
运行开发中的站点
Django提供了一个轻量级的Web服务程序,无需在生产环境即可快速测试开发中的站点。启动这个服务之
后,会检查所有的代码是否正确,还可以在代码被修改之后,自动重新载入修改后的代码,但部分情况下
比如向项目中加入了新的文件,还需要手工关闭服务再重新启动。
在命令行中输入下列命令就可以启动站点:
python manage.py runserver
应该会看到下列输出:
Performing system checks...
System check identified no issues (0 silenced).
May 06, 2018 - 17:17:31
Django version 2.0.5, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
现在可以在浏览器中打开 http://127.0.0.1:8000/ ,会看到成功运行站点的页面,如下图所示:
能看到这个页面,说明Django正在运行,如果此时看一下刚才启动站点的命令行窗口,可以看到浏览器
的 GET 请求:
[15/May/2018 17:20:30] "GET / HTTP/1.1" 200 16348
站点接受的每一个HTTP请求,都会显示在命令行窗口中,如果站点发生错误,也会将错误显示在该窗口
中。
在启动站点的时候,还可以指定具体的主机地址和端口,或者使用另外一个配置文件,例如:
python manage.py runserver 127.0.0.1:8001 --settings=mysite.settings
如果站点需要在不同环境下运行,单独为每个环境创建匹配的配置文件。
当前这个站点只能用作开发测试,不能够配置为生产用途。想要将Django配置到生产环境中,必须通过一
个Web服务程序比如Apache,Gunicorn或者uWSGI,将Django作为一个WSGI程序运行。使用不同web服
务程序部署Django请参考: https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/ 。本书的第十第十
三章三章 上线上线会介绍如何配置生产环境。
2.2 项目设置
项目设置
打开 settings.py 看一下项目设置,其中列出了一些设置,但这只是Django所有设置的一部分。可以
在 https://docs.djangoproject.com/en/2.0/ref/settings/ 查看所有的设置和初始值。
文件中的以下设置值得注意:
DEBUG 是一个布尔值,控制DEBUG模式的开启或关闭。当设置为 True 时,Django会将所有的日志和错误信息
都打印在窗口中。在生产环境中则必须设置为 False ,否则会导致信息泄露。
ALLOWED_HOSTS 在本地开发的时候,无需设置。在生产环境中, DEBUG 设置为 False 时,必须将主机名/IP
地址填入该列表中,以让Django为该主机/IP提供服务。
INSTALLED_APPS 列出了每个项目当前激活的应用,Django默认包含下列应用:
django.contrib.admin :管理后台应用
django.contrib.auth :用户身份认证
django.contrib.contenttypes :追踪ORM模型与应用的对应关系
django.contrib.sessions :session应用
django.contrib.messages :消息应用
django.contrib.staticfiles :管理站点静态文件
MIDDLEWARE 是中间件列表。
ROOT_URLCONF 指定项目的根URL patterns配置文件。
DATABASE 是一个字典,包含不同名称的数据库及其具体设置,必须始终有一个名称为 default 的数据库,默认
使用SQLite 3数据库。
LANGUAGE_CODE 站点默认的语言代码。
USE_TZ 是否启用时区支持,Django可以支持根据时区自动切换时间显示。如果通过 startproject 命令创建站
点,该项默认被设置为 True 。
如果目前对这些设置不太理解也没有关系,在之后的章节中这里的设置都会使用到。
2.3 项目(项目(projects)与应用(
)与应用(applications))
在整本书中,这两个词会反复出现。在Django中,像我们刚才那样的一套目录结构和其中的设置就是一个
Django可识别的项目。应用指的就是一组Model(数据模型)、Views(视图)、Templates(模板)和
URLs的集合。Django框架通过使用应用,为站点提供各种功能,应用还可以被复用在不同的项目中。你
可以将一个项目理解为一个站点,站点中包含很多功能,比如博客,wiki,论坛,每一种功能都可以看作
是一个应用。
2.4 创建一个应用
创建一个应用
我们将从头开始创建一个博客应用,进入项目根目录( manage.py 文件所在的路径),在系统命令行中输
入以下命令创建第一个Django应用:
python manage.py startapp blog
这条命令会在项目根目录下创建一个如下结构的应用:
blog/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
这些文件的含义为:
admin.py :用于将模型注册到管理后台,以便在Django的管理后台(Django administration site)查看。管理后
台也是一个可选的应用。
apps.py :当前应用的主要配置文件
migrations 这个目录包含应用的数据迁移记录,用来追踪数据模型的变化然后和数据库同步。
models.py :当前应用的数据模型,所有的应用必须包含一个 models.py 文件,但其中内容可以是空白。
test.py :为应用增加测试代码的文件
views.py :应用的业务逻辑部分,每一个视图接受一个HTTP请求,处理这个请求然后返回一个HTTP响应。
3 设计博客应用的数据架构(
设计博客应用的数据架构(data schema))
schema是一个数据库名词,一般指的是数据在数据库中的组织模式或者说架构。我们将通过在Django中
定义数据模型来设计我们博客应用在数据库中的数据架构。一个数据模型,是指一个继承
了 django.db.models.Model 的Python 类。Django会为在 models.py 文件中定义的每一个类,在数据库中
创建对应的数据表。Django为创建和操作数据模型提供了一系列便捷的API(Django ORM):
我们首先来定义一个 Post 类,在 blog 应用下的 models.py 文件中添加下列代码:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class Post(models.Model):
STATUS_CHOICES = (('draft', 'Draft'), ('published', 'Published'))
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique_for_date='publish')
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
class Meta:
ordering = ('-publish',)
def __str__(self):
return self.title
这是我们为了博客中每一篇文章定义的数据模型:
title :这是文章标题字段。这个字段被设置为 Charfield 类型,在SQL数据库中对应 VARCHAR 数据类型
slug :该字段通常在URL中使用。slug是一个短的字符串,只能包含字母,数字,下划线和减号。将使用 slug 字
段构成优美的URL,也方便搜索引擎搜索。其中的 unique_for_date 参数表示不允许两条记录的 publish 字段日期
和 title 字段全都相同,这样就可以使用文章发布的日期与 slug 字段共同生成一个唯一的URL标识该文章。
author :是一个外键字段。通过这个外键,告诉Django一篇文章只有一个作者,一个作者可以写多篇文章。对于
这个字段,Django会在数据库中使用外键关联到相关数据表的主键上。在这个例子中,这个外键关联到Django内
置用户验证模块的 User 数据模型上。 on_delete 参数表示删除外键关联的内容时候的操作,这个并不是Django特
有的定义,而是SQL 数据库的标准操作;将其设置为 CASCADE 意味着如果删除一个作者,将自动删除所有与这
个作者关联的文章,对于该参数的设置,可以查
看 https://docs.djangoproject.com/en/2.0/ref/models/fields/#django.db.models.ForeignKey.on_delete 。 related_name 参
数设置了从 User 到 Post 的反向关联关系,用 blog_posts 为这个反向关联关系命名,稍后会学习到该关系的使
用。
body :是文章的正文部分。这个字段是一个文本域,对应SQL数据库的 TEXT 数据类型。
publish :文章发布的时间。使用了 django.utils.timezone.now 作为默认值,这是一个包含时区的时间对象,可以
将其认为是带有时区功能的Python标准库中的 datetime.now 方法。
created :表示创建该文章的时间。 auto_now_add 表示当创建一行数据的时候,自动用创建数据的时间填充。
updated :表示文章最后一次修改的时间, auto_now 表示每次更新数据的时候,都会用当前的时间填充该字
段。
statues :这个字段表示该文章的状态,使用了一个 choices 参数,所以这个字段的值只能为一系列选项中的值。
Django提供了很多不同类型的字段可以用于数据模型,具体可以参
考: https://docs.djangoproject.com/en/2.0/ref/models/fields/ 。
在数据模型中的Meta类表示存放模型的元数据。通过定义 ordering = ('-publish',) ,指定了Django在进行数
据库查询的时候,默认按照发布时间的逆序将查询结果排序。逆序通过加在字段名前的减号表示。这样最
近发布的文章就会排在前边。
__str__() 方法是Python类的功能,供显示给人阅读的信息,这里将其设置为文章的标题。Django在很多
地方比如管理后台中都调用该方法显示对象信息。
如果你之前使用的是Python 2.X,注意在Python 3中,所有的字符串都已经是原生Unicode格式,所以只
需要定义 __str__() 方法, __unicode__() 方法已被废弃。
3.1 激活应用
激活应用
为了让Django可以为应用中的数据模型创建数据表并追踪数据模型的变化,必须在项目里激活应用。要激
活应用,编辑 settings.py 文件,添加 blog.apps.BlogConfig 到 INSTALLED_APPS 设置中:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog.apps.BlogConfig',
]
BlogConfig 类是我们应用的配置类。现在Django就已经知道项目中包含了一个新应用,可以载入这个应
用的数据模型了。
3.2 创建和执行迁移
创建和执行迁移
创建好了博客文章的数据模型,之后需要将其变成数据库中的数据表。Django提供数据迁移系统,用于追
踪数据模型的变动,然后将变化写入到数据库中。我们之前执行过的 migrate 命令会