• 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.模板语言包括

    • 变量:

      • 语法:
        {{ 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标签注释模版中的多行内容

  • 相关阅读:
    【软剑攻城队】团队介绍发布!
    【软剑攻城队】团队简介
    耿丹计科16-1大家庭
    便捷从使用git开始
    交流从选择coding.net开始
    相识从C语言开始
    川师2016上半年软件工程助教总结
    2016年川师大软件工程本科生博客地址列表
    川师大研究生2015级现代软件工程(2016春)
    SVN:Cleanup failed to process the following paths
  • 原文地址:https://www.cnblogs.com/SutCoderHang/p/9835433.html
Copyright © 2020-2023  润新知