一、models(模块)的知识展开
- ORM(管理器)的概念,ORM指的是对象-关系-映射的简称,是把数据库表映射成为一个类,类属性表示字段,这样做的好处是对于开发者而言更加
的可操作化,在对数据库进行增删改查可直接对对象进行操作而不用考虑具体SQl语句。而内部实现交互是管理器自动完成的,在定义类的时候一定要继承models模块中的Model类,使该类为模型类。目前models支持sqlite、mysql、oracle三种主流数据库。但这样做也有一定
的缺点那就是内部转化的过程中可能会花费一些时间,使得效率不是那么高。 - 使用Models之前第一步先去到配置文件中更改database为要使用的数据库,同时把目前的应用加入配置文件中installed_app项。当定义完字段类型及属性之后makemigrations生成迁移文件,是内部转换sql语句,最后在migrate执行迁移文件,将数据导入。
- 多张表的关系类型分为
一对多:ForeignKey—— 将字段定义在多的一端
多对多:ManyToManyField —-将字段定义在两端
一对一:OneToOneField—— 将字段定义任意一段 - 具体处理一对多的关系(以英雄图书为例)由于将字段定义在了多的一端,所以当使用多的一端查询时可以直接使用hero.book_id 多少一端由于没有字段,所以应使用 book.heroinfo_set 获取该图书中的所有英雄
- 在定义字段时tittle= models.CharField()括号里面写的是字段选项,如max_length=20就是最大长度为20以及如default设置默认值,null等多种字段选项,用来装饰限制该字段
- 元选项Meta类,该类是定义在模型类里面的,在python中称为元类。而该类在此处的作用是设置元信息, 如可以更改表的名字db_table=‘book’以及排序等等,表名默认为 应用名_模型类
- 在一个项目中创建多个应用的好处是增加代码的重用性
- 再去增删改一个表时,可以利用该表生成一个对象,利用对象对该表中的信息进行操作,最后调用save()方法进行保存
- 模型中的管理器
- 管理器是模型类中的一个属性,用来对模型类和数据表之间进行映射,默认使用的是object管理器。
- 而这种管理器也可以被我们自己定义,通过自己定义一个类,然后继承models模块里的Manager,通过重写或新定义里面的方法也能实现管理器功能。
- 而在Django我们也可以使用多个管理器,在使用时直接用模型类引用管理中方法即可,用到哪个管理器引用哪个。
- 重新定义管理器有两个好处
第一,可以对查询之后的结果进行筛选使其返回不同的结果集
第二,可以更方便的创建模型对象,这种方法可以用来取代在模型类本身中定义create类方法(因为模型类中不能定义__init__对象方法)。在管理器
中定义creat方法,之后用到的话直接通过对象调用即可。
- 有关查询
- 再使用模型类的过程中,一定会涉及到查询表中的数据并传到前台进行显示。而其实现途径和写SQL查询语句本质上没有什么区别的。
都是返回一个查询集,而返回查询集之前我们仍然可以对其进行筛选、聚合等一系列SQL操作。 - 返回查询集的方法称为过滤器,具体有all()、filter()、exclude()、order_by()、values()等多种方法
其中最长用的是all(通通返回)、filter()对返回之前进行过滤 - 使用filter过程中会用到比较、包含等多种运算关系,具体都是在filter(这里写),其中实现两个不同字段的比较要引入F对象
- 管理器也可以直接使用聚合aggregate(Max等方法)进行直接查询返回结果
- filter()中的条件与关系用filter(条件1).filter(条件2)来实现,或者filter(条件1,条件2)
而或的关系要引入Q对象,通过Q(条件1)|Q(条件2)来实现
- 再使用模型类的过程中,一定会涉及到查询表中的数据并传到前台进行显示。而其实现途径和写SQL查询语句本质上没有什么区别的。
二、视图的具体展开
View里面主要就是两部分,即HTTPRequest对象和HTTPResponse对象,一个是用来接收请求,一个是用来返回响应;除此之外还有状态保持Session和Cookie的原理及使用。
1.HttpRequest对象及属性
- 服务器在接收到http协议的请求后,会根据报文自动生成Request对象,那它有什么作用呢,主要是为了生成htpp请求进行GET、POST方法。
- 而GET用来获取页面信息,获取的过程中可以通过一些键值对产生不同的页面信息,键值对可分为一个键对应一个值,和一个键对应多个值。
- post用来表单提交,是隐藏的。上面说了Get不隐藏 直接显示在url中,而POST这些键值对会放到表单之中,是看不见的,最后也可以根据建获取值,存放到数据库中或进行显示。
- 获取参数共分为两种方式
- 键值对-->GET POST
- 获取一个值数字,url获取。就是前面提到的利用正则中加括号,但这种方式具有局限性,因为只能获取url中所包含的。
2.HttpResponse对象及属性
- HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建。可以把它当成一种响应报文,就是当用户访问服务器之后所得到一个结果,即页面生成。
- 而页面生成的过程分为两步,是Response做的,即加载模板,渲染模板,不调用模板只能返回数据。
- 而cookie也是在这里设置的,什么是cookie:就是存储浏览器的一段文本信息,按照键值对格式存储,如果在某个网站存储了键值对了,如果再次访问浏览器会带着cookie信息放到请求头中发到服务器。这个都可以在Response中设置。
- response还有两个字类:重定向Redirect、Json
3.Session会话机制
- 由于http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态。
- 客户端与服务器端的一次通信,就是一次会话
- 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
- 存储方式包括cookie、session,会话一般指session对象
- 使用cookie,所有数据存储在客户端,注意不要存储敏感信息
- 推荐使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id
- 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面
- 访问当前请求者的数据Session也是一个字典,Session依赖于Cookie。
- 使用Session实现登录的流程:
- 第一步在view设置一个登录主页页面,配好url和模板
- 第二步,再点击登录后跳转另外一个页面,配好url和模板。当用户输入用户名密码之后,点击提交。
- 第三步,当用户点击提交后,将用户所输入的信息存入Session(一般是数据库当中),然后将页面重定向回主页面
- 最后用户退出后,删除Session在重定向回主页面。
模板的具体展开
一、模板介绍
-
作为Web框架,Django提供了模板,可以很便利的动态生成HTML
模版系统致力于表达外观,而不是程序逻辑 -
模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用
-
模板包含
- HTML的静态部分
- 动态插入内容部分
-
Django模板语言,简写DTL,定义在django.template包中
由startproject命令生成的settings.py定义关于模板的值:- DIRS定义了一个目录列表,模板引擎按列表顺序搜索这些目录以查找模板源文件
- APP_DIRS告诉模板引擎是否应该在每个已安装的应用中查找模板
-
常用方式:在项目的根目录下创建templates目录,设置DIRS值
*DIRS=[os.path.join(BASE_DIR,"templates")]*
二、定义模板
1.模板语言包括
-
变量:
- 语法:
{{ variable }} - 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出
-变量名必须由字母、数字、下划线(不能以下划线开头)和点组成
-当模版引擎遇到点("."),会按照下列顺序查询:- 字典查询,例如:foo["bar"]
- 属性或方法查询,例如:foo.bar
- 数字索引查询,例如:foo[bar]
- 如果变量不存在, 模版系统将插入'' (空字符串)
- 在模板中调用方法时不能传递参数
- 语法:
-
标签
-
语法:{ % 代码块 % }
-
作用
- 在输出中创建文本
- 控制循环或逻辑
- 加载外部信息到模板中供以后的变量使用
-
包含
-
for标签
-
if标签
-
comment标签
-
include:加载模板并以标签内的参数渲染
-
url:反向解析
-
动态生成链接地址,而不是提前把它写死。用于在点击之后跳转页面的url,如果规定其地址在更改app地址时会很麻烦。所以可以使用url标签,让其根据namespace、name确定。同时也可以接受参数
{% url ‘namespace’:‘name’ ‘url接受的参数’ %}
-
-
csrf_token:这个标签用于跨站请求伪造保护
-
布尔标签:and、or,and比or的优先级高
-
block、extends:详见“模板继承”
-
autoescape:详见“HTML转义”
-
-
过滤器
- 语法:{ { 变量|过滤器 }},例如{ { name|lower }},表示将变量name的值变为小写输出
- 使用管道符号 (|)来应用过滤器
- 通过使用过滤器来改变变量的计算结果
- 可以在if标签中使用过滤器结合运算符
-
注释{# 代码或html #}
-
单行注释
{#...#}
-
注释可以包含任何模版代码,有效的或者无效的都可以
{# { % if foo % }bar{ % else % } #}
-
使用comment标签注释模版中的多行内容