• 18-2 djanjo中间件和orm多对多操作,以及ajax


    一  中间件

    0 怎样使用中间件
    在setting配置文件里面注册你的中间件,如下:
    'mymiddleware.MD1', 前面是文件名,后面是类名
    然后在你的mymiddleware文件里导入:
    from django.utils.deprecation import MiddlewareMixin

    例子:setting配置

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'mymiddleware.MD1',
        
    ]

    mymiddleware.py文件配置:

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse,render
    
    
    class MD1(MiddlewareMixin):
        def process_request(self, request):
            print("这是md1中的process_request方法")
            print(id(request))
            request.s21 = ""




    1. 什么时候使用中间件?
      1 当需要在全局改变Django框架的输入输出时
      2. 中间件不宜添加过多,功能过于复杂
      否则会增加请求的响应时间

    3. Django中间件有哪些
    1. 五个方法(三个常用)
    主要记忆:执行时间、执行顺序、参数和返回值


    1. process_request(self,request)
    1. 执行时间
    在执行视图函数之前执行
    2. 执行顺序
    按照注册的顺序执行,从上到下依次执行
    3. 参数和返回值
    1. request参数和视图函数中是同一个对象
    2. 返回值:
    1. 返回None:请求继续往后执行,(执行了views函数)
    2. 返回响应对象:请求就结束了,要返回响应了


    2. process_response(self, request, response)
    1. 执行时间
    视图函数执行之后(拿到响应对象之后)

    2. 执行顺序
    按照注册的倒序执行
    3. 参数和返回值
    1. 参数:request请求对象
    response:响应对象
    2. 返回值:
    只能返回响应对象
    1. 返回默认的
    2. 自己生成一个响应对象返回


    3. process_view(self, request, view_func, view_args, view_kwargs)
    1. 执行时间
    视图函数之前,在urls.py找到将要执行的视图函数之后
    2. 执行顺序
    注册的顺序执行

    3. 参数和返回值
    1. 参数:
    1. request: 请求对象
    2. view_func:将要执行的视图函数
    2. 返回值:
    1. 返回None:继续往后执行
    2. 返回响应对象,直接跳出,下面的process_view就不执行了,按照process_response方法的顺序执行

    有条件触发:
    4. process_template_response(self,request,response)
    1. 执行时间:
    1. 视图函数之后,并且返回的响应对象是要有render方法
    2. 执行顺序:
    1. 按照注册的倒序执行
    3. 返回值:
    1. 对传递过来的响应对象,调用其render方法,把返回值向后继续传递


    5. process_exception(self, request, exception)
    1. 执行时间:
    1. 当视图函数中抛出异常的时候才执行
    2. 执行顺序:
    1. 注册的倒序
    3. 参数和返回值
    exception:视图函数中抛出的异常
    返回响应对象,就跳出按照process_response方法的顺序执行

    二  orm多对多

    1. ORM多对多字段
    # 多对多,自动帮我们在数据库建立第三张关系表
    books = models.ManyToManyField(to='Book', related_name="authors")
    参数:
    - to:表示和哪张表建立多对多的关系
    - related_name:表示返向查询时使用的那个字段名,默认反向查询时使用表名_set的方式

    2. 多对多字段的方法
    1. 查询
    .all() --> 多对多查询的方法,

    2. 删除

    3. 添加新作者
    1. 当form表单提交的数据是列表(多选的select多选的checkbox)

    取值:
    request.POST.getlist("hobby")

    例子:

    class Addauthor(views.View):
        def get(self, request):
            book_list = models.Book.objects.all()
            return render(request, "add_author.html", {"book_list": book_list})
    
        def post(self, request):
            # 获取用户的新名字
            auth_name = request.POST.get("name")
            # 获取用户添加的书,因为多选所有用getlist
            books_ids = request.POST.getlist("books")
            print(auth_name, books_ids)
            # 创建用户
            author_obj = models.Author.objects.create(name=auth_name)
            # 去第三张关系表里建立记录
            author_obj.books.set(books_ids)
            return redirect("/author_list/")

    4 编辑:

    2. .set([id1,id2,...]) 参数是一个列表 --> 删除原来的设置新的,更新关联对象
    3. .add(id值) --> 在原来的基础上增加新的纪录

    例子:

    class Editauthor(views.View):
        def get(self, request, edit_id):
            author_name = models.Author.objects.filter(id=edit_id).first()
            book_obj = models.Book.objects.all()
            return render(request, "edit_author.html", {"author_name": author_name, "book_list": book_obj})
    
        def post(self, request, edit_id):
            author_obj = models.Author.objects.filter(id=edit_id).first()
            new_name = request.POST.get("name")
            # 获取选择的书
            new_book = request.POST.getlist("books")
            author_obj.name = new_name
            author_obj.save()
            # 保存关联的书的id
            author_obj.books.set(new_book)
            return redirect("/author_list/")

    多对多语句查询:

    import os
    if __name__=='__main__':
        if __name__ == '__main__':
            os.environ.setdefault("DJANGO_SETTINGS_MODULE", "练习.settings")
    
            import django
    
            django.setup()
            from app01 import models
    
            # add方法和set方法
            '''
            author_obj=models.Author.objects.first()
            ret=author_obj.books.first().title
            print(ret)
    
            author_obj.books.set([2,502,503,501]) # 为作者添加三本书 作者id在前,书名id在后
            author_obj.books.add(504) # add在原来的基础上增加  set删除原来的然后在设置新的
            ret=author_obj.books.all().values_list("title")
            print(ret)
            '''
    
         #查询操作
        # 查询第一个作者写过书的名字
        #1 基于对象的查询正向查找
        ret=models.Author.objects.first().books.all().values("title")
        print(ret)
        #基于对象的反向查找  # 默认按照表名_set.all()
        ret = models.Book.objects.last().authors.all().values("name")
        print(ret)
    
    
        #基于queryset的双下滑线查询
        # ret = models.Author.objects.filter(id=2).values("books__title") #查询id为2作者写的书
        # print(ret)
    
        # 基于queryset的双下滑线的反向查找,由书找作者(两张写法)
        res=models.Book.objects.filter(id=504).values_list("authors__name")
        res1=models.Book.objects.filter(id=504).values("authors__name")
        # print(res,res1)
    View Code

    三 ajax

    参考 https://www.cnblogs.com/liwenzhou/p/8718861.html

    1 ajax的特点:
    优点:
    1. 偷偷发请求,用户无感知
    2. 局部刷新 相对于其他请求方式而言,返回的数据量小
    3. 同一个页面可以发送多次请求 异步
    缺点:
    1. 如果滥用,对服务端的压力比较大

    ajax的使用:
    jQuery版:
    导入jQuery

    $.ajax({
    url: "往哪里发请求",
    type: "发送请求的类型",
    data: {
    
    },
    success:function(res){
    
    }
    })

    例子:注册一个用户名,并检查用户名是否注册

    views.py如下:

    def reg(request):
        return render(request,".//ajax/reg.html/")
    
    def check_username(request):
        username=request.POST.get("name")
        print(username)
        exsit_name=models.Userinfo.objects.filter(name=username)
        print(exsit_name)
        # obj=models.Userinfo.objects.first()
        # print(obj)
        if exsit_name:
            res="用户名已经存在"
        else:
            res=""
        return HttpResponse(res)

    html如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>注册</title>
    </head>
    <body>
    {% csrf_token %}
    <input type="text" id="i1"><span style="color: red"></span>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <script>
        $("#i1").blur(function () {
            $.ajax({
                url:"/check_username/",
                type:"post",
                data:{
                    "name":$("#i1").val(),
                     "csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val()
                },
                success:function (res) {
                    console.log(res);
                    $("#i1+span").text(res);
    
                }
            })
    
        })
    </script>
    
    </body>
    </html>
    View Code

    四 jquery部分知识

    2. .text()
    1. 获取标签的文本内容 $("div").text()                                    --> 默认取所有div的文本内容
    2. 有参数表示 设置标签的文本内容 $("div").text(‘哈哈’)       --> 设置所有div标签的文本为哈哈
    3. .html()
    1. 获取标签的html内容 $("div").html()                                   --> 默认取第一个div的html内容
    2. 有参数表示 设置标签的html内容 $("div").html(‘哈哈’)       --> 设置所有div标签的html内容为哈哈

    4. val()
    1. 获取input标签的值 $("input").val()                                       --> 默认取第一个input的值
    2. 有参数表示 设置input标签的值 $("input").val(666)              --> 设置所有input标签的值为666

  • 相关阅读:
    Linux
    C/C++ 引入头文件时 #include<***.h> 与 #include"***.h" 区别
    2018.01.10
    java 选择结构if
    引用数据类型 Scanner Random
    java 运算符
    java变量和数据类型
    Java se基础
    数据库设计
    MySQL 其他基础知识
  • 原文地址:https://www.cnblogs.com/huningfei/p/9516822.html
Copyright © 2020-2023  润新知