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 MiddlewareMixinfrom django.shortcuts import HttpResponse,renderclass 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")# 获取用户添加的书,因为多选所有用getlistbooks_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/")

多对多语句查询:

 

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

import osif __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如下:

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

<!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

 

上一篇:react fiber摘要


下一篇:V16之前的render方法&Fiber执行流程