Django基础
学习目标
认识Django,了解Django与Python版本的关系
熟练搭建与使用虚拟环境
熟悉Django项目的结构
了解Django项目与应用的区别
掌握在项目中创建与注册应用
熟悉Django架构,掌握MTV各部分的功能
一、Django框架介绍
- 何为框架
度娘上说:框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间
交互的方法;
另一种定义认为,框架是可被应用开发者定制的应用骨架 ,是某种应用的半成品
使用框架开发项目的好处
开发周期短
维护成本低
软件生产效率和质量也得到了提高 - 认识Django框架
Django,发音为[`dʒæŋɡəʊ], Django是劳伦斯出版集团的开发人员为开发新闻内容网站而设计出来
的一个软件,它遵循MVC思想,但是有自己的一个名词,叫做MVT
Django是使用Python语言编写的一个开源Web应用框架,鼓励快速开发,是当前最为流行的python
Web开发框架
Django框架优点: - Django的特点
1)重量级框架
对比python其他web框架,比如flask,Tornado 而言,Django原生提供了众多的功能组件,让开发更
简便快速。
提供项目工程管理的自动化脚本工具
数据库ORM支持(对象关系映射,英语:Object Relational Mapping)
模板
表单
Admin管理站点
文件管理
认证权限
session机制
缓存
2)MVT模式
有一种程序设计模式叫MVC,其核心思想是分工、解耦,让不同的代码块之间降低耦合,增强代码的可
扩展性和可移植性。
MVC的全拼为Model-View-Controller,为了将传统的输入(input)、处理(processing)、
输出(output)任务运用到图形化用户交互模型中而设计的。随着标准输入输出设备的出现,开
发人员只需要将精力集中在业务逻辑的分析与实现上。后来被推荐为Oracle旗下Sun公司Java EE
平台的设计模式,并且受到越来越多开发者欢迎。现在虽然不再使用原来的分工方式,但是这种
分工的思想被沿用下来,广泛应用于软件工程中,是一种典型并且应用广泛的软件架构模式。后
来,MVC的思想被应用在了Web开发方面,被称为Web MVC框架。
MVC模式说明
M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。
V全拼为View,用于封装结果,生成页面展示的html内容。
C全拼为Controller,用于接收请求,处理业务逻辑,与Model和View交互,返回结果。
3)Django的MVT
Django的MVT
M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。
V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答。
T全拼为Template,与MVC中的V功能相同,负责封装构造要返回的html。
项目启动后,用户通过浏览器向Web服务器发起请求,Web服务器将请求传递到要处理该请求的
Django项目,Django接收用户通过浏览器发起的请求,urls.py文件根据URL地址分发路由,将请求交
给views.py中相应的视图;视图处理请求(此时涉及数据存取),并将处理结果与模板结合生成响应数
据返回给Web服务器,服务器将数据返回到浏览器,最终呈现给用户。具体如下图所示 - Django学习资料
官方网站
Github源码
1.11版中文文档
二、安装Django
2.1 创建虚拟的Python环境
实际生产中同一项目的不同版本可能依赖不同的环境,这时需要在系统中安装多个版本的
Python,若直接在物理环境中进行配置,多个版本的软件之间会产生干扰。为了避免这种情况,
应使用virtualenv命令创建虚拟环境,以隔离不同版本的Python
windows中安装虚拟Python环境
1.打开控制台窗口,使用pip工具可以在线安装virtualenv,具体命令如下:
pip install virtualenv
2.virtualenv安装完成后,使用命令创建虚拟环境,具体如下所示:
virtualenv first_env
提示: 若要创建包含指定Python版本的虚拟环境,需使用-p选项指定该版本Python可执行文件所在的
路径,完整命令格式如下:
virtualenv –p python.exe 路径 虚拟环境名
3.执行虚拟环境目录中Scripts下的activate文件可启用虚拟环境、deactivate文件可退出虚拟环境,
具体命令如下:
C:\Users\admin>.\first_env\Scripts\activate
C:\Users\admin>.\first_env\Scripts\deactivate
4.若以上命令执行成功,命令行的路径名之前会出现“(虚拟环境名)”,具体如下所示
(first_env) C:\Users\admin>
5.输入python,检验是否安装成功
任务一: 在windows 中安装 python 虚拟环境 : my_env ,在D:/myEnvs目录下:
2.2 虚拟环境管理工具virtualenvwrapper 安装
用户可通过虚拟环境管理工具virtualenvwrapper简化虚拟环境的创建和管理,在Windows系统中安装
该工具,具体命令如下:
pip install virtualenvwrapper-win
安装完成后,用户可分别使用以下命令创建和管理虚拟环境
说明 命令
创建虚拟环境 mkvirtualenv env
启用虚拟环境 workon env
退出虚拟环境 deactivate
删除虚拟环境 rmvirtualenv env
查看虚拟环境列表 lsvirtualenv/workon
进入当前虚拟环境所在目录 cdvirtualenv
任务2: 使用virtualenvwrapper工具创建python 虚拟环境first_env
2.3 使用pip安装Django
Django对Python版本的依赖关系具体如下表所示
Django其实也是Python内置的包,可以通过pip工具管理
安装Django
pip install django==2.2.8
验证虚拟环境安装是否成功
三、Django项目搭建
学习目标
创建项目工程
创建应用
了解工程目录结构
定义视图与路由
3.1 新建Django项目
使用Django提供的命令,可以创建一个Django项目实例需要的配置项——包括数据库配置、Django配
置和应用程序配置的集合。新建Django项目命令的语法格式如下: - 创建项目
创建工程的命令为:
例如:想要在D:\的pythonProject目录中创建一个名为mysite的项目工程,可执行如下命令:
执行后,会多出一个新目录名为mysite,此即为新创建的工程目录。 - 项目目录说明
查看创建的项目目录,结构如下
mysite : 根目录,项目的容器
manage.py:一个提供Django项目管理功能的命令行工具
子mysite:一个纯Python包,其中存放项目文件,在引用项目文件时会使用到这个包名。
mysite\settings.py 是项目的整体配置文件。
mysite\urls.py 是项目的URL配置文件。
mysite\wsgi.py 是项目与WSGI兼容的Web服务器入口。
django-admin startproject 工程名称
workon first_env
cd d:\pythonProject
django-admin startproject mysite
3.启动项目
在开发阶段,为了能够快速预览到开发的效果,django提供了一个纯python编写的轻量级web服
务器,仅在开发阶段使用。
运行服务器命令如下:
可以不写IP和端口,默认IP是127.0.0.1,默认端口为8000。
启动后可见如下信息:
在浏览器中输入网址“127.0.0.1:8000”便可看到效果。
django默认工作在调式Debug模式下,如果增加、修改、删除文件,服务器会自动重启。
按ctrl+c停止服务器。
默认情况下开发服务器在本地IP的8000端口上启动,若要更改端口,可将端口作为命令行参数传
递。例如在端口8080上启动服务器,命令如下所示:
python manage.py runserver 8080
任务三: 创建Django项目 mysite
3.2 创建应用
python manage.py runserver ip:端口
或:
python manage.py runserver
在Web应用中,通常有一些业务功能模块是在不同的项目中都可以复用的,故在开发中通常将工程
项目拆分为不同的子功能模块,各功能模块间可以保持相对的独立,在其他工程项目中需要用到某个特
定功能模块时,可以将该模块代码整体复制过去,达到复用。
在Django中, 把这一个个子功能模块成为 应用 ,一个Django项目可以包含多个Django应用,每个
应用可在多个项目中被重复利用 - 创建应用
在django中,创建应用模块目录可以通过命令来操作,即:
manage.py 为上述创建工程时自动生成的管理文件。
例如,在刚才创建的mysite工程中,想要创建一个用户users应用模块,可执行:
执行后,可以看到工程目录中多出了一个名为blogs的子目录。 - 应用目录说明
查看此时的工程目录,结构如下:
python manage.py startapp 应用名称
admin.py 文件: 跟网站的后台管理站点配置相关。
apps.py 文件: 用于配置当前应用的相关信息。
migrations 目录: 用于存放数据库迁移历史文件。
models.py 文件: 用户保存数据库模型类。 m : model v: view T: Template
tests.py 文件: 用于开发测试用例,编写单元测试。
views.py 文件: 编写视图函数,MVT模型中的V。
db.sqlite3 : 轻量级关系型数据库,django默认使用sqlite数据库
任务4: 在mysite项目中创建users应用 - 注册应用
创建出来的子应用目录文件虽然被放到了工程项目目录中,但是django工程并不能立即直接使用该应
用,需要注册安装后才能使用。
在工程配置文件settings.py中,INSTALLED_APPS项保存了工程中已经注册安装的子应用,初始工程中
的INSTALLED_APPS如下:
注册安装一个应用的方法,即是将子应用的配置信息文件apps.py中的Config类添加到
INSTALLED_APPS列表中。
例如,将刚创建的users子应用添加到工程中,可在INSTALLED_APPS列表中添
加’users.apps.UsersConfig’。
提示:在pycharm中 打开Django项目
找到项目的根目录,打开Django项目
设置项目的python解析器(虚拟环境)
3.3 创建视图、定义路由
Django的视图是定义在应用的views.py中的。 - 创建视图:
打开刚创建的users模块,在views.py中编写视图代码。
说明:
视图函数的第一个传入参数必须定义,用于接收Django构造的包含了请求数据的HttpReqeust对
象,通常名为request。
视图函数的返回值必须为一个响应对象,可将要返回的字符串数据放到一个HTTPResponse对象
中。 - 定义路由URL
为了保证服务器能成功找到用户请求的页面,需为应用配置路由。在应用users中创建子路由文件
urls.py,分别配置根路由和子路由,配置信息分别如下:
- 在应用中新建一个urls.py文件用于保存该应用的路由。
from django.http import HttpResponse
def index(request):
“”"
index视图
:param request: 包含了请求信息的请求对象
:return: 响应对象
“”"
return HttpResponse(“hello the world!”) - 在users/urls.py文件中定义子路由信息。
- 在项目工程总路由mysite/urls.py中添加users应用的路由信息。
使用include来将子应用users里的全部路由包含进项目路由中;
‘users/’ 决定了users应用的所有路由都已/users/开头,如我们刚定义的视图index,其最终的完
整访问路径为/users/index/。
3.4 启动运行
1.命令方式启动django项目
python manage.py runserver
from django.urls import path
from . import views
urlpatterns是被django自动识别的路由列表变量
urlpatterns = [
每个路由信息都需要使用url函数来构造
url(路径, 视图)
path(‘index/’, views.index),
]
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path(‘admin/’, admin.site.urls),
path(‘users/’, include(‘users.urls’))
]
2.pycharm中直接运行项目
3.运行效果
在浏览器中输入网址127.0.0.1:8000/users/index/ 可看到返回的信息
回顾MVT模型
补充
1.直接在 物理环境中安装django ,不使用虚拟环境
2.在pycharm中直接创建Django项目
1.创建Django项目
2.修改Django版本
使用pycharm创建Django项目时默认使用最新的版本
修改Django版本
当安装成功后,再打开项目解析器设置,效果如下:
3.修改settings.py文件
导入os模块
import os
修改DATAASES配置
4.删除asgi.py文件
四、后台数据管理
一个站点或者网站,除了给用户浏览及操作外,还需要对后台数据进行管理,比如添加商品,修
改商品等等。
Django提供了一个可插拔的后台管理系统——Admin 应用,该系统可以从模型中读取元数据,并
提供以模型为中心的界面。Admin后台管理系统不仅让管理员可以便捷地管理、发布、维护网站
的内容,也为开发人员节约了大量开发时间。本章节将对Admin管理系统进行介绍。
学习目标:
掌握进入后台管理系统的方法
掌握模型的注册方法
熟悉ModelAdmin的选项
了解Admin认证和授权
1.认识Admin后台管理页面
1.1 进入Admin
1)Django项目的根urls.py文件中默认定义了一个“/admin/”路由,该路由指向Admin
2)启动Django项目,在浏览器中输入“http://127.0.0.1:8000/admin/”,页面会跳转到后台管理系
统的登录页面
3)数据库迁移
生成迁移文件,即生成sql语句
python manage.py makemigrations
执行迁移文件,即执行sql语句
python manage.py migrate
4)登录后台管理系统需要输入管理员用户名与密码,此时可在命令终端通过“python manage.py
createsuperuser”命令创建管理员用户
提示:
以上示例中的电子邮件可为空,密码长度至少为8个字符(非强制),输入的密码不会在屏幕显
示。创建完成后的管理员用户信息会被存储在auth_user表中
5) 登录成功后进入站点管理界面
6)管理界面本地化
首次登录之后是英文界面,后台管理是给管理员使用的,英文界面阅读起来就比较困难了,这里可
以将后台管理本地 化。 本地化是将显示的语言、时间等使用本地的习惯,这里的本地化就是进行中国
化,中国大陆地区使用简体中文, 时区使用亚洲/上海时区,注意这里不使用北京时区表示。
两种方式可以将Admin系统的语言本地化
在seetings.py文件中将配置项LANGUAGE_CODE的值设置为“zh-Hans” ,TIME_ZONE的值设置
为"Asia/Shanghai"
在seetings.py文件中配置项MIDDLEWARE中添加本地化中间件
“django.middleware.locale.LocaleMiddleware”
任务: 进入admin站点管理系统
1.2 使用Admin 对数据库中的数据操作 --》 模型
- 注册模型
若想使Admin系统中呈现自定义的模型数据,需在应用的admin.py文件中将模型注册到后台系
统。
使用装饰器@admin.register()注册模型
使用admin.site.register()注册模型
提示:
需提前在应用的models.py文件中添加模型类
效果如下:
修改应用的显示名称
在goods应用的 init.py 文件中添加如下设置
在goods/apps.py文件中使用verbose_name设置应用的名称
语法 @admin.register(模型名)
from django.contrib import admin
from .models import Goods
装饰器的方式
@admin.register(Goods)
class xxx
语法 admin.site.register(模型名)
admin.site.register(Goods)
from django.db import models
Create your models here.
class Goods(models.Model):
name = models.CharField(max_length=50, verbose_name=‘商品名’) # 商品名称
default_app_config = ‘goods.apps.GoodsConfig’
修改模型显示的名称
任务2: 创建商品模型,且在后台管理界面显示
2) 模型数据的增删改
对Goods模型添加字段等属性
from django.apps import AppConfig
class GoodsConfig(AppConfig):
name = ‘goods’
verbose_name = ‘商品信息’
gppds/models.py
from django.db import models
Create your models here.
class Goods(models.Model):
class Meta:
verbose_name = ‘商品’ # 模型名称(单数)
verbose_name_plural = verbose_name # 模型名称(复数)
from django.db import models
Create your models here.
class Goods(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name=“创建
时间”)
update_time = models.DateTimeField(auto_now=True, verbose_name=“更新时
间”)
name = models.CharField(max_length=50, verbose_name=‘商品名’)
price = models.DecimalField(max_digits=10, decimal_places=2,
verbose_name=‘价格’)
stock = models.IntegerField(default=0, verbose_name=‘库存’)
sales = models.IntegerField(default=0, verbose_name=‘销量’)
class Meta:
db_table = ‘tb_goods’ # 数据表名
verbose_name = ‘商品’ # 模型名称(单数)
verbose_name_plural = verbose_name # 模型名称(复数)
在django shell中执行 数据库迁移 命令
python manage.py makemigrations #生成迁移文件
python manage.py migrate #执行迁移文件
在admin 页面对goods模型 实现增、删、改等操作
增加商品
修改或删除商品
删除商品
def str(self):
return ‘%s:%s’ % (self.id, self.name)
2.定制Admin后台管理页面
在使用默认的admin管理页面时,当不满足需求时,就需要定制Admin的后台管理页面
ModelAdmin类主要用于控制模型信息在Admin后台页面中的展示, ModelAdmin类包含了诸多
选项,包括列表页选项、编辑页选项,管理员可以通过这些选项灵活地控制要呈现的数据
2.1 定制列表页选项
常用的列表页选项有:
1)list_display选项
list_display选项用于控制页面展示的字段,该选项的值为元组或列表类型,其中的元素可以是模
型字段或自定义字段
在应用的admin.py文件中定义
方式1:
方式2:
方式一
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
显示自定义字段
自定义字段指与模型相关,但并不包含在模型中的字段,这种字段是定义在应用的admin.py
文件中的一些函数,这些函数会将模型实例作为参数
2)list_display_links选项
用于设置需在页面中以链接形式展示的字段,可跳转到详情页面
方式二
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘name’, ‘price’, ‘stock’, ‘sales’, ‘create_time’,
‘update_time’)
admin.site.register(Goods, GoodsAdmin)
#admin.py
def sales_volume(g):
total = g.price * g.sales
return f’{g.name}销售额为:{total}’
sales_volume.short_description = ‘商品销售额’ # 设置字段描述
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’, sales_volume)
提示:
默认第一个显示字段有链接跳转,假如设置了list_display_links,则依据list_display_links指定的字段
设置链接
3)list_filter选项
list_filter选项用于开启列表页过滤器,该选项可以接收模型中的字段作为过滤条件
admin.py
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’,‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
list_display_links = (‘id’,‘name’,) # 设置字段链接
admin.py
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’,‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
list_display_links = (‘id’,‘name’) # 设置字段链接
list_filter = [‘sales’, ‘name’] # 过滤器
4)list_per_page选项
使用list_per_page选项可以设置每页显示的数据量
5) list_editable选项
list_editable选项用于设置可编辑的字段,字段若被指定为编辑字段,页面上可直接编辑该字段。
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
list_display_links = (‘name’,) # 设置字段链接
list_filter = [‘sales’, ‘name’] # 过滤器
list_per_page = 5 # 每页展示5条记录
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
list_display_links = (‘name’,) # 设置字段链接
list_filter = [‘sales’, ‘name’] # 过滤器
list_per_page = 5 # 每页展示5条记录
list_editable = (‘price’,) # 设置商品价格price为可编辑字段
提示:list_display_links与list_editable不能同时设置同一字段
6)search_fields选项
search_fields选项用于配置搜索字段
7) actions_on_top选项
actions_on_top选项用于设置是否在顶部显示动作下拉框,默认为True,表示在顶部显示。
8) actions_on_bottom 选项
actions_on_bottom选项用于设置管理员动作是否在底部显示,默认为False,表示不在底部显
示,当设置为True表示在底部显示。
search_fields = (‘name’,‘id’) # 表示以name,id 作为搜索字段
任务:定制后台管理的列表页面
2.2 定制编辑页选项
单击列表页面中的id等字段后,页面会跳转到相应记录的编辑页。通过编辑页选项可以控制在编
辑页显示的字段、设置字段分组、将字段设置为只读等,这些选项在应用的admin.py文件的模型
管理类中使用
1)fields选项
fields选项用于控制编辑页要显示的字段,它的值是元组类型
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’, ‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
actions_on_top = False
actions_on_bottom = True # 在底部显示管理员动作
goods/admin.py
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’, ‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
fields = (‘name’, ‘price’, ‘stock’)
fields选项支持以二维元组形式设置字段分栏显示,在fileds中一个元组表示一栏数据
2)fieldsets选项
fieldsets选项用于对可编辑字段进行分组,该选项不可与fields选项同时使用
goods/admin.py
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’, ‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
fields = ((‘name’, ‘price’),(‘stock’, ‘sales’))
@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):
list_display = (‘id’, ‘name’, ‘price’, ‘stock’, ‘sales’,
‘create_time’, ‘update_time’)
fieldsets = (
(‘商品基本信息’, {‘fields’: [‘name’, ‘stock’, ‘sales’]}),
(‘商品价格信息’, {‘fields’: [‘price’]})
)
3)编辑页其他选项
任务:定制后台管理的编辑页面
3.认证和授权
Admin提供管理用户与组、用户与组权限的功能,使用超级用户登录后台管理系统后可以对用户
或组进行增加,或变更用户与组的权限
3.1 用户管理
3.2 组管理
组的作用是批量对用户的权限进行管理和分配,将一个用户加入到一个组中,该用户就拥有了该
组所拥有的所有权限,如此可避免逐个管理具有相同权限的用户,减少工作量,提高管理效率
3.3 权限管理
- 单击选择用户来修改页面中的用户名称可进入修改用户页面。修改用户页面中包含账号信息、个人信
息、权限、重要日期四组数据信息,其中账号信息中包含用户名和密码 - 使用当前登录的超级用户可以将当前管理的用户添加到指定组中
3)选中左侧列表框的权限,单击“ ”按钮可将权限移动到右侧列表框中,方可为用户赋予权限
4)在Admin站点管理页面单击“组”进入选择组来修改页面,在该页面中单击组名称进入修改组页面,修
改组页面中可为指定的组设置权限
任务:分别创建两个用户和两个组,分别对组设置权限,且用户添加到组中
五、网页展示
通过Admin后台管理,保存了商品数据到数据库,那下面应该就是以网页的形式把商品呈现给客
户
5.1 商品列表首页展示 - 在views通过Model获取要展示的数据
- 准备商品首页的模板网页
settings.py配置模板页路径
from django.shortcuts import render
from django.http import HttpResponse
from django.shortcuts import render
from .models import Goods
Create your views here.
def index(requst):
“”“首页”""
通过模型获取数据库中的商品列表数据
goods_list = Goods.objects.all()
print(goods_list)
return HttpResponse(“商品首页”)
index.html模板页面