Django框架-爱代码爱编程
mvc介绍
mvc是一种框架,该框架的思想为分工
就是将一份大工程拆分为若干个小工程,每个工程只负责该部分的内容
mvc的核心是解耦
mvc工作原理
如图,用户在浏览器上提交一个表单,c控制器接受到,发送给m,m将表单数据添加到数据库中,然后c控制器在让v产生html文件然后返回浏览器页面
- m:model模型,用于和数据库进行交互
- v:视图,用于产生html页面
- c:控制器,用与接受、发送数据,沟通进行处理,与m、v交互,返回应答
Django简介
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。2019年12月2日,Django 3. 0发布
MTV框架模式
- m:与mvc框架中m一样用于与数据库进行交互
- t:和mvc中的v功能一样,用于产生html
- v:用于接受,和m、t进行交互,返回数据
python虚拟环境
因为在我们开发的是否,通常是有多个项目的,但有的项目需要依赖于python的这个版本,
另一项项目需要依赖于另一个python版本
又因为在我们python中,在安装了一个新版本后会将前一个版本进行覆盖
这时候我们要先对之前的那个项目进行测试时就没办法,
这时候我们就需要用到oython的虚拟环境
虚拟环境
顾名思义,虚拟环境就是一个虚拟的,它模拟了你真是的环境,包含了所有功能,但在虚拟环境中安装的包、模块一类的只存在于当前虚拟环境中,和你本机中的python环境并不冲突,只能在虚拟环境中使用。
安装虚拟环境
想要创建虚拟环境首先需要安装virtualenv包和virtualenvvmrapper包
保证ubantu 能够联网
- sudo pip3 install virtualenv :安装虚拟环境
- sudo pip3 install virtualenvwrapper:安装虚拟环境扩展包
- 进入家目录配置.bashrc文件
在文件底部加入
export WORK_HOME=$HOME/.virtualenvs
用于设置虚拟环境路径
source /usr/local/bin/virtualenvwrapper.sh - 使用source .bashrc命令设配置文件生效
虚拟环境操作
-
创建虚拟环境
mkvirtualenv 名字
创建python3的虚拟环境
mkvirtualenv -p python3 名字 -
进入虚拟环境
workon 虚拟环境名 -
查看虚拟机环境
workon 两个tab
-退出虚拟环境
deactivate -
删除虚拟环境
rmvirtualenv 虚拟环境名 -
虚拟环境下安装包
pip install 包名 -
查看虚拟环境中安装的包
pip list
pip freeze
Django创建和使用
创建Django
命令:
django-admin startproject 项目名
项目目录:
- _init_:表示这是一个可导入的包
- setting.py:项目的配置文件
- urls.py:进行文件的路由设置
- wsgi.py:web服务器和Django交互的接口
- manage.py:项目的管理文件
创建应用
通常在一个项目中由多个模块组成,项目的每一个功能都是一个应用
命令:
python/python3 manage.py startapp 应用名
应用目录:
- models.py:模块文件,用于与数据库进行交互
- tests.py: 用于测试人员进行测试使用
- views.py:用于与T、M进行交互,收发数据
- admin.py:用于配置后台管理接口
将应用绑定到项目
进入setting.py文件
将应用名加入到该元组中实现应用的绑定
启动服务器
Django 框架自带了一个web服务器
命令:
python3 manage.py runserver
模型
orm介绍
orm是一种思想,该思想解决类在python中频繁的调用数据时端麻烦
使用orm思想,再次需要执行数据库操作时只需通过创建一个对象并调用响应的方法即可
orm实现,是一个类,类名为该数据表的表名,类里的类属性为数据表中的字段
Django框架中对数据库的使用就是应用了这个思想
表的创建
在models.py文件中
定义一个类该类需要继承models.Model类
该类就属于一个模型类
设计表中的数据
定义了一个bookinfo表,表中有两个字段
模型类生成表
上一步只是在模型类中定义了一个表,要想将该表存到数据库中需要,生成迁移文件、迁移文件两个不住
- 生成迁移文件
命令:python3 manage.py makemigrations
生成的迁移文件存储在migrations文件夹中 - 执行迁移表命令
该命令用于将迁移文件迁移到数据库
命令:python3 manage.py migrate
通过模型类操作数据库
首先需要导入模型类
添加数据
创建数据库对象
通过实例对象操作类属性添加实例属性
最后调用save()方法添加数据
ForeignKey(关联数据表名);
定义关联外键,多表建立联系
查询数据
通过数据表类查询
数据表类名.objects.get(条件);
查询出来为数据表字段对象
通过类属性来获取记录
objects.all():查询所有数据
改数据
直接通过数据表字段对象调用属性重新赋值即可
最后徐通过save()方法再次提交一下即可
删除数据
通过数据表记录字段对象
调用delect()方法即可
后台管理
后台管理是开发者在浏览器中留的一个对数据进行管理操作的页面,django中实现后台管理需要四个步骤
本地化
配置setting.py文件将时区和语言设置为中国的
中国语言:zh-hans;
中国时区:Asia/Shanghai
创建管理员
命令
python3 manage.py createsuperuser
根据提示设置管理账号和密码
注册模型类
创建好后台管理页面后需要将要管理的数据链接到后台
这就需要进行注册模型,来告诉django框架根据注册的模型类来生成对应的管理页面
在admin.py文件中需要进行设置
命令:
admin.site.register(数据表类名)
使用数据表类需要导入数据表类所在的模块
自定义管理页面
通过定义自定义管理类来控制后台页面的输出
创建一个自定义管理类,继承于admin.ModelAdmin
类里面实现
list_display=[要显示的字段];
字段属性和选项
模型类中数据类型和mysql数据类型的对应关系
类型:
CharField(max_length) -----> Char: max_length:表示最大字符个数
TextFIeld() -----> Text:
boolleanField()
NullBooleanField()
Inteager() -----> int
DecimalField(max_digits=, decimal_places=): 总数, 小数位;
FloatField ------> float 参数同上
DateField(auto_now = bool, auto_now_add=bool ) -----> Date;
auto_now: 如果设置为ture:则表示该行修改后,该字段值为当前修改时间
auto_now_add : auto_now: 如果设置为ture:则表示该行创建后,该字段值为当前创建时间
这两个参数只能使用其一;
选项
在类型方法中设置
default:默认值;
primary key : 主键
unique:唯一
db_index : 为该字段创建索引
null:如果该值为true则表示该字段允许为空 默认为false
db_column:用于指定表名
blank:如果设置为true则表示该字段允许为空白,默认为false
查询
Django操作数据库中的数据,
通过模型类.objects调用函数对模型类对应的数据表 进行查询
- get()函数:返回满足条件的一条且只能有一条数据,返回值是一个模型类对象
- all()函数:返回模型类对应表格中的所有数据,返回值是QuerySet对象
- filter()函数:返回满足条件的所有数据,返回值是QuerySet对象
条件格式:模型类属性名__条件名:值
判等:exact
BookInfo.objects.filter(id__exact=);
判等条件可以省略:
BookInfo.objects.filter(id=);
模糊查询:
包含----> like “%%”:
contains=值:表示包含该值
开头 ----> like “k%”;
startswith=值
结尾-----> like “%k”:
endswith = 值
空查询
isnull=bool值
范围查询
in=[];
表示匹配列表中的值
比较查询
gt:大于
lt:小于
gte:大于等于
lie:小于等于
日期查询
year
month
day - exclude()函数:返回不满足条件的数据,返回值QuerySet对象
- order_by :对数据进行排序,返回值为QuerySet对象
使用:对查询集进行排序
例:bookinfo.objects.all().order_by("模型类属性”[, “模型类属性”]);
默认升序排序,将序排序只需要在模型类属性前加-号即可
F对象
使用F对象之前需要进行导入
from django.db.models import F
该对象用于进行模型类属性之间的比较
例:查询阅读量大于评论量的图书
bookInfo.objects.felter(bread__gt=F("bcomment"));
F可以进行算数运算
例:查询阅读量大于评论量的两倍的数据
bookInfo.objects.felter(bread__gt=F("bcomment")*2);
Q对象
使用Q对象首先需要导入
from django.db.models import Q
该对象用于进行条件间的逻辑处理
&、|、~
使用:Q(查询条件) 逻辑符号 Q(查询条件);
例:查询性别为男且年龄大于18的学生
student.objects.filter(Q(gender__exact = “男”)&Q(age__gt=18));
聚合函数
使用aggregate(聚合函数)函数进行聚合操作,返回值是一个字典
使用前需要导入相应的聚合函数
from django.db.models import max, min, count, Avg;
例:查询所有图书的数目
from django.db.models import count;
bookinfo.objects.all().aggregate(count(“id”));
返回值是一个字典:key值为 聚合字段名__聚合函数名;
count函数:用于返回该表中的数据个数;返回值是一个数字
例:bookinfo.objects.all().count();
查询集对象
查询集对象可以使用以上的所有属性和方法
查询集的特性
-
惰性查询
查询集只有 在实际使用查询集中的数据的是后续才会执行查询
也就是说,如果你将一个查询的结果使用变量装起来后,则只有调用运行该变量才会执行查询 -
缓存
在使用查询集时只有第一次使用查询集的时候才会发生查询,以后再次调用查询集则不在会发生查询,则使用缓存中的结果
操作
可以对查询集进行取下标或者切片操作(下标不允许为负),
进行切片操作会产生一个新的查询集
可以对查询集进行循环遍历
exists()方法:可以判断一个查询集是否为空
模型类之间的关系
一对多
在多类中定义:models.Foreignkey(表类名);
多读多
在那任意类中定义:models.ManyToManyField(另一个类名)
一对一
在任意类中定义: models.OneToOneField(另一个类名);
关联查询
在一对多关系中,一对应的那个类我们成为多类,多对应的那个类成为一类
,我们把多类中 定义的建立联系的类属性称为关联属性
我们普通查询方法如下图:
通过模型类查询
-
通过多类查询一类中的数据
一类名.objects.filter(多类名__多类属性名__查询条件函数);
例:bookinfo.objects.fileter(heroinfo__hcomment__contains=‘八’):
查询图书表中英雄的描述中包含八的图书 -
通过多类查询一类
多类名.object.filter(关联属性__一类属性名__查询条件函数);
注意:
1、通过模型类实现关联查询时,要查那个类中的数据就是用那个类来查
2、写关联条件时,如果类中没有关联属性,则使用对应的类名来查询,
如果类中有关联属性,则直接使用关联属性
自关联
通过在咋类中加入:ForeignKey(self)创建
管理器对象
objects是django自动帮我们生成的一个管理器对象,通过这个管理器对象我们可以实现查询
objects是models.Manger类的一个对象
我们可以自定义管理器对象
-
在模型类中
通过models.Manger对象创建一个管理器对象
此时默认的obects将失去作用,新的管理器对象生效 -
自定义Manger类继承于models.Manger类
自定义管理类应用场景 -
改变结果集的数据
通过在自定义的Manger类重写Manger对象的方法,对查询数进行过滤
例:重写Manger对象的all方法,对数据进行控制 -
为Manger对象添加额外的方法
在自定义的Manger类中我们可以添加新方法,对数据进行操作;
例如:添加添加字段、删除字段的一系列方法
元选项
我们通过模型类创建的表的表名默认是 应用名_类名
这就会导致如果我们修改了应用名,程序就会报错
这就需要使用元选项设置我们的创建的表的表名不再依赖于应用名
元选项:用于设置通过模型类创建的表的表名
使用:在模型类中定义一个Meta类,在里面定义一个db_table属性
指定表名;
设置过,我们再通过模型类创建表时就会使用我们指定的表名进行创建
视图
视图的功能
用于接受用户请求,将接受到的请求与M和T进行交互,返回应答
应答类型:可以返回一个html文件,response对象也可以是一个redirect重定向
视图函数的使用
使用
定义视图函数
定义视图函数时必须要有request参数,该参数是一个HttpRequest对象
配置url
- 首先需要在项目目录下创建templates目录
该目录用于存储应用所使用到的模板文件
我们一般在该目录下创建一个以应用名命名的子目录,该目录下存储该应用所使用的所有文件,以便区分个应用之间的所使用到的文件 - 在使用之前需要在项目配置文件中设置templates文件的路径
找到TEMPLATES项,在DIR对应的value中输入os.path.join(BASE_DIR, "templates"即可 - 在项目的urls文件中包含该应用的urls文件
- 在应用目录下创建urls文件,在里面编辑路由信息
该url参数用于为所访问的页面定义指定的url视图文件 - 在应用的views文件中定义所对应的视图文件
在该文件下定义所指定的视图函数
如果返回的是模板文件,必须是templates目录下所拥有的文件
URL匹配过程
- 用户输入所访问文件的地址
- 将/前的和?后的参数全部去除
- 将剩下的信息到模板的urls文件中进行匹配
- 将匹配成功部分去除
- 将剩下的部分,到url所包含的文件中进行匹配
- 匹配成功调用所对应的视图函数
- 模板函数向客户端返回所需要的信息
错误视图
默认情况下我们的DEBUG模式是开启的,该模式下我们如果有错误,会在浏览器中给出提示信息,但在我们的网站发布出去以后,如果还是模式就会导致我们的信息泄露,
我们可以在项目的配置文件中设置是否开启DEBUG模式
设置为False则关闭
关闭DEBUG模式后,当我们程序出错,django会给出一个默认的错误页面404,我们也可以自定义该页面,直接在templates目录中新建404.html即可,不用进行路由配置,django自动为该文件进行设置了路由
出现404的情况
- 没有配置url路由
- url路由配置错误
出现500的情况
- 视图出错
捕获URL参数
在进行模板文件的编写是有时候需要使用url地址中得信息,
这个时候就需要用到url捕获技术
在进行url匹配时,把需要捕获的部分设置成一个正则表达式组 ,这样django框架就会自动把匹配成功后相应的组的内容传递给所对应的视图函数,在函数中定义一个参数进行接收
- 位置参数
参数名可以随意定义 - 关键字参数
为该参数定义一个名称
但在参数中用于接受该值的参数名必须和所定义的名字相同
在进行url匹配时使用(?p)
request对象
该对象用与存储用户所提交的数据
属性
- path:用于获取请求页面的完整路径
- method:用于获取请求方式
- encoding:用户获取提交数据使用的编码格式
- GET:用于获取用户使用get方式提交的数据
- POST:用户获取用户使用post方式提交的数据
- COOKIES:用于获取用户所有的cookies信息,返回值是一个字典
- session:用于获取客户的当前会话信息,返回值是一个字典
模板
模板的功能
模板文件用于产生html页面,控制页面上需要显示的内容,模板文件不仅只是一个html文件
模板文件由两部分组成
- 静态文件:css、js、img
- 动态文件:用于动态的生成一些网页内容,需要使用模板语言来产生
模板的使用
通常是在视图函数中使用产生的模板文件,返回给客户端
模板文件使用步骤
使用前需要导入django.tempalte import loader
- 加载模板文件
通过调用loader.get.template(‘模板路径’)方法,加载模板文件
返回一个模板对象 - 定义模板上下文
通过定义模板上下文,将视图需要传输的数据传递到模板中
RequestContext(request, {}); 返回一个上下文对象 - 模板渲染产生 html页面
用于将视图传输过来的数据和模板中的模板变量进行互换,渲染然后返回一个渲染过的html页面
模板对象.render(上下文对象); - 返回给客户端
将渲染或的html页面文件,通过Response对象返回到客户端。
模板的加载顺序
- 首先去配置的模板目录下去寻找要加载的文件
- 在配置的模板目录下没找到,则在拥有templates目录的所有已定义的应用目录下去寻找
- 如果都找不到则报错
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/jwefhkjn/article/details/111099443