一 中间件css
0 怎样使用中间件
在setting配置文件里面注册你的中间件,以下:
'mymiddleware.MD1', 前面是文件名,后面是类名
而后在你的mymiddleware文件里导入:
from django.utils.deprecation import MiddlewareMixinhtml
例子:setting配置jquery
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文件配置:ajax
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. 返回响应对象:请求就结束了,要返回响应了django
2. process_response(self, request, response)
1. 执行时间
视图函数执行以后(拿到响应对象以后)
2. 执行顺序
按照注册的倒序执行
3. 参数和返回值
1. 参数:request请求对象
response:响应对象
2. 返回值:
只能返回响应对象
1. 返回默认的
2. 本身生成一个响应对象返回 session
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方法,把返回值向后继续传递app
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)
三 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>
四 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