Django进阶

一、models(模块)的知识展开

  1. ORM(管理器)的概念,ORM指的是对象-关系-映射的简称,是把数据库表映射成为一个类,类属性表示字段,这样做的好处是对于开发者而言更加
    的可操作化,在对数据库进行增删改查可直接对对象进行操作而不用考虑具体SQl语句。而内部实现交互是管理器自动完成的,在定义类的时候一定要继承models模块中的Model类,使该类为模型类。目前models支持sqlite、mysql、oracle三种主流数据库。但这样做也有一定
    的缺点那就是内部转化的过程中可能会花费一些时间,使得效率不是那么高。
  2. 使用Models之前第一步先去到配置文件中更改database为要使用的数据库,同时把目前的应用加入配置文件中installed_app项。当定义完字段类型及属性之后makemigrations生成迁移文件,是内部转换sql语句,最后在migrate执行迁移文件,将数据导入。
  3. 多张表的关系类型分为
    一对多:ForeignKey—— 将字段定义在多的一端
    多对多:ManyToManyField —-将字段定义在两端
    一对一:OneToOneField—— 将字段定义任意一段
  4. 具体处理一对多的关系(以英雄图书为例)由于将字段定义在了多的一端,所以当使用多的一端查询时可以直接使用hero.book_id 多少一端由于没有字段,所以应使用 book.heroinfo_set 获取该图书中的所有英雄
  5. 在定义字段时tittle= models.CharField()括号里面写的是字段选项,如max_length=20就是最大长度为20以及如default设置默认值,null等多种字段选项,用来装饰限制该字段
  6. 元选项Meta类,该类是定义在模型类里面的,在python中称为元类。而该类在此处的作用是设置元信息, 如可以更改表的名字db_table=‘book’以及排序等等,表名默认为 应用名_模型类
  7. 在一个项目中创建多个应用的好处是增加代码的重用性
  8. 再去增删改一个表时,可以利用该表生成一个对象,利用对象对该表中的信息进行操作,最后调用save()方法进行保存
  9. 模型中的管理器
  • 管理器是模型类中的一个属性,用来对模型类和数据表之间进行映射,默认使用的是object管理器。
  • 而这种管理器也可以被我们自己定义,通过自己定义一个类,然后继承models模块里的Manager,通过重写或新定义里面的方法也能实现管理器功能。
  • 而在Django我们也可以使用多个管理器,在使用时直接用模型类引用管理中方法即可,用到哪个管理器引用哪个。
  • 重新定义管理器有两个好处
    第一,可以对查询之后的结果进行筛选使其返回不同的结果集
    第二,可以更方便的创建模型对象,这种方法可以用来取代在模型类本身中定义create类方法(因为模型类中不能定义__init__对象方法)。在管理器
    中定义creat方法,之后用到的话直接通过对象调用即可。
  1. 有关查询
    • 再使用模型类的过程中,一定会涉及到查询表中的数据并传到前台进行显示。而其实现途径和写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)来实现

二、视图的具体展开

View里面主要就是两部分,即HTTPRequest对象和HTTPResponse对象,一个是用来接收请求,一个是用来返回响应;除此之外还有状态保持Session和Cookie的原理及使用。

1.HttpRequest对象及属性

  1. 服务器在接收到http协议的请求后,会根据报文自动生成Request对象,那它有什么作用呢,主要是为了生成htpp请求进行GET、POST方法。
  2. 而GET用来获取页面信息,获取的过程中可以通过一些键值对产生不同的页面信息,键值对可分为一个键对应一个值,和一个键对应多个值。
  3. post用来表单提交,是隐藏的。上面说了Get不隐藏 直接显示在url中,而POST这些键值对会放到表单之中,是看不见的,最后也可以根据建获取值,存放到数据库中或进行显示。
  4. 获取参数共分为两种方式
    • 键值对-->GET POST
    • 获取一个值数字,url获取。就是前面提到的利用正则中加括号,但这种方式具有局限性,因为只能获取url中所包含的。

2.HttpResponse对象及属性

  1. HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建。可以把它当成一种响应报文,就是当用户访问服务器之后所得到一个结果,即页面生成。
  2. 而页面生成的过程分为两步,是Response做的,即加载模板,渲染模板,不调用模板只能返回数据。
  3. 而cookie也是在这里设置的,什么是cookie:就是存储浏览器的一段文本信息,按照键值对格式存储,如果在某个网站存储了键值对了,如果再次访问浏览器会带着cookie信息放到请求头中发到服务器。这个都可以在Response中设置。
  4. response还有两个字类:重定向Redirect、Json

3.Session会话机制

  1. 由于http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态。
    • 客户端与服务器端的一次通信,就是一次会话
    • 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
    • 存储方式包括cookie、session,会话一般指session对象
    • 使用cookie,所有数据存储在客户端,注意不要存储敏感信息
    • 推荐使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id
    • 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面
  2. 访问当前请求者的数据Session也是一个字典,Session依赖于Cookie。
  3. 使用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.模板语言包括

  • 变量:

    • 语法:
    • 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出
      -变量名必须由字母、数字、下划线(不能以下划线开头)和点组成
      -当模版引擎遇到点("."),会按照下列顺序查询:
      • 字典查询,例如: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标签注释模版中的多行内容

posted @ 2018-10-23 10:57  SutFutureCoder  阅读(116)  评论(0编辑  收藏  举报