Django2


1、关系映射
    1、一对一(1:1)
        entry = models.OneToOneField(Entry)

        class Wife(models.Model):
            ... ...
            author = models.OneToOneField(Author)
    2、一对多(1:M)
        1、什么是一对多
            A表中的一条数据可以与B表中的多条数据关联
            B表中的一条数据只能与A表中的一条数据关联

            如:
                出版社(Publisher) 和 图书(Book)
                商品类型(GoodsType) 和 商品(Goods)
        2、在数据库中的体现
            通过外键(Foreign Key)来体现一对多
            在"多"表中增加外键(Foreign Key)对"一"表的主键进行引用
        3、语法
            使用 外键(Foreign Key)
            在"多"的实体中,增加:
                属性=models.ForeignKey(Entry)
            ex:
                Book(多) 和 Publisher(一)

                class Book(models.Model):
                    ... ...
                    publisher = models.ForeignKey(Publisher)

        4、查询
            Book(多) 和 Publisher(一)

            class Book(models.Model):
                ... ...
                publisher=models.ForeignKey(Publisher)

            1、正向查询 - 通过Book查询Publisher    
                #查询id为1的书籍的信息
                    book = Book.objects.get(id=1)
                #查询关联的publisher
                    publisher = book.publisher
            2、反向查询 - 通过Publisher查询Book

                Django会在 1 的实体中增加 关联对象_set 属性
                用于查询 多 的数据

                结合 Publisher 和 Book 之间关系 :
                    在 Publisher 中 增加了一个 book_set 属性

                ex:
                    publisher=Publisher.objects.get(id=1)
                    books = publisher.book_set.all()
    3、多对多(M:N)
        1、什么是多对多
            A表中的一条记录可以与B表中的任意多条记录匹配
            B表中的一条记录可以与A表中的任意多条记录匹配
            ex:
                作者 与 书籍
        2、在数据库中的体现
            必须创建第三张表,关联涉及到的两张表数据
        3、语法
            允许在任何一个实体中增加操作:
                entry = models.ManyToManyField(Entry)
            ex:
                class Author(models.Model):
                    ... ...
                    book = models.ManyToManyField(Book)
        4、查询
            class Author(models.Model):
                ... ...
                book = models.ManyToManyField(Book)
            
            1、正向查询-通过Author查询所有的Book
                author = Author.objects.get(id=1)
                books = author.book.all()
                通过 关联属性.all() 查询所有对应数据

            2、反向查询-通过Book查询所有的Author
                Django中 会在Book 实体中增加一个隐式属性 author_set

                book = Book.objects.get(id=1)
                authors = book.author_set.all()
2、自定义查询对象 - objects
    1、声明类EntryManager,继承自models.Manager
        在 EntryManager 中添加自定义函数

        class EntryManager(models.Manager):
            def 函数名(self,自定义参数列表):
                ... ...
                return ... ...
    2、使用 EntryManager 覆盖 models 类中的objects
        class Entry(models.Model):
            objects = EntryManager()
    
    练习:
        1、为 Author 指定自定义 objects 对象
            1、查询年纪小于指定年纪的作者的信息
        2、为 Book 指定自定义 objects 对象
            1、查询书名中包含指定关键字的书籍的信息
3、HttpRequest
    1、HTTP 协议
        1、请求(request)
            1、请求起始行
            2、请求消息头
            3、请求主体
        2、响应(response)
            1、响应起始行
                协议名称/版本号 响应状态码 原因短句
            2、响应消息头
            3、响应主体
    2、HttpRequest介绍
        1、什么是HttpRequest
            HttpRequest,在Django中是对请求对象的封装体现。它封装了请求过程中所有的信息。在Django中,HttpRequest被化身成了request封装到视图处理函数中作为参数,在调用视图时自动传入

        2、HttpRequest中的主要内容
            1、request.scheme : 请求协议
            2、request.body : 请求主体
            3、request.path : 请求路径
            4、request.get_host() : 请求主机/域名
            5、request.method : 请求方法
            6、request.GET : get请求方式提交的数据
            7、request.POST : post请求方式提交的数据
            8、request.COOKIES : cookies中的数据
4、HttpRequest
    1、CSRF 跨站点攻击
        解决方案:
            1、在 settings.py中
                删除CsrfViewMiddleWare中间件
            2、在视图的处理函数上 @csrf_protect
            3、在模板中<form>下的第一行增加:
                {% csrf_token %}
    2、地址栏拼参数
        手动拼写参数(Query String)到提交地址的后面
        http://地址/?名称1=值1&名称2=值2
4、使用 forms 模块处理表单
    1、forms 模块的作用
        通过 forms 模块,允许将表单与class相结合,可以自动的生成表单控件
    2、使用 forms 模块
        1、创建 forms.py 文件
        2、导入 forms
            from django import forms
        3、创建 class,一个class对应一个表单
            必须继承自 forms.Form类
        4、在class中创建属性
            一个属性对应着一个表单控件
            (参考文档)
    3、在模板中解析 form 对象
        1、注意
            1、需要自定义<form>
            2、需要自定义 提交按钮
        2、解析方式
            1、手动解析
                在视图中创建 xxForm() 并发送到模板中
                ex:
                    form = RemarkForm()
                    return render(request,'xx.html',locals())
                手动解析:
                    模板中:
                    {% for field in form %}
                        {{field.label}} : 控件前的文本
                        {{field}} : 表示控件
                    {% endfor %}
                
            2、自动解析
                1、{{form.as_p}}
                    将表单中的每个属性都解析成一个p标记,再显示标签以及控件
                2、{{form.as_ul}}
                    将表单中的每个属性都解析成一个li标记,再显示标签以及控件
                    注意:需要自定义<ul></ul> 或 <ol></ol>
                3、{{form.as_table}}
                    将表单中的每个属性都解析成一个tr标记,再显示标签以及控件
                    注意:需要自定义<table>
    4、使用 forms.Form 获取表单数据
        1、通过 forms.Form 子类的构造函数,接受post数据
            form = xxxForm(request.POST)
        2、需要让 form 通过验证后再取值
            form.is_valid()
            返回true:提交的数据已经通过所有验证,允许获取表单数据
            返回false:提交的数据有暂时未通过验证的
        3、获取表单提交的数据
            通过 form.cleaned_data(字典)接收提交的数据
            cd = form.cleaned_data
            print(cd['subject']) #获取提交数据中subject对应的数据    
        5、forms 的高级处理
        将 Models 和 Forms 结合到一起使用
        1、在 forms.py中,创建class,继承自 forms.ModelForm
        2、创建内部类 :Meta,关联Form 和 Models
            1、model : 指定要关联的Model类是谁
            2、fields :从models中取哪些字段要生成控件
                1、取值 "__all__",取出全部字段生成控件
                2、指定一个列表,声明允许生成控件的字段名
            3、labels : 指定每个属性关联的label,取值为字典
                labels = {
                    '属性名1':'label文本1',
                    '属性名2':'label文本2',
                }
5、cookies
    1、什么是cookies
        cookies 是一种数据存储技术
        将一段文本保存在客户端(浏览器)的一种技术,并可以长时间保存
    2、cookies的应用场合
        1、保存登录信息
        2、保存搜索关键词
    3、django 中使用 cookies
        1、设置 cookies 的值(将数据保存进客户端)
            语法:
                响应对象.set_cookie(key,value,expires)
                    key:cookie的名字
                    value:cookie的值
                    expires:cookie的保存时间,以s为单位
                        60*60*24*365
            1、不使用模板
                resp = HttpResponse('')
                resp.set_cookie('uname1','zsf',60)
                return resp
            2、使用模板
                resp = render(request,'xxx.html',locals())
                resp.set_cookie(key,value,expires)
                return resp
            3、使用重定向
                resp = HttpResponseRedirect('/xxx/')
                resp.set_cookie(key,value,expires)
                return resp
            
        2、获取 cookies 的值(从客户端中取数据)
                request.COOKIES
                封装了当前站点下的所有cookie信息
                
                练习
                    1、完善 fruitday 登录
                    2、当用户访问登录路径时
                        判断cookies中是否有登录信息(id,uphone)
                        如果有登录 信息则提示 欢迎回来
                        如果没有,则显示登录页
6、session - 会话
    1、什么是session    
        session,实际上就是在服务器上为浏览器开辟一段控件,用于保存相关的信息
    2、在 Django 中使用session
        1、设置 session 的值
            request.session['key'] = 值;

            设置session的过期时间
            request.session.set_expiry(time)
            time 就是以秒为单位的一个时间
        2、获取session的值
            request.session[key] 或 request.session.get(key)
        3、删除 session 的值
            del request.session['key']
    3、在 settings.py中,有关session的设置
        1、SESSION_COOKIE_AGE
            作用:设置sessionID在cookies中的存活时间
            ex:
                SESSION_COOKIE_AGE=60*10
                sessionID在cookie中保留10分钟
        2、SESSION_EXPIRE_AT_BROWSER_CLOSE
            作用:设置在浏览器关闭时同时清除服务器上对应的session空间
            ex:
                SESSION_EXPIRE_AT_BROWSER_CLOSE=True

       

猜你喜欢

转载自blog.csdn.net/qq_15551663/article/details/81502705