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)
三 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
18-2 djanjo中间件和orm多对多操作,以及ajax的更多相关文章
- Python - Django - ORM 多对多操作
models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...
- django ORM多对多操作
创建多对多: 方式一:自定义关系表 class Host(models.Model): nid = models.AutoField(primary_key=True) hostname = mode ...
- Django ORM 多对多操作 使用聚合函数和分组 F查询与Q查询
创建表 # models.py form django.db import models class Book(models.Model): # 表名book,django会自动使用项目名+我们定义的 ...
- Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页
models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...
- Django学习手册 - ORM 多对多表
定义表结构: class Host(models.Model): hostname = models.CharField(max_length=32) port = models.IntegerFie ...
- Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)
Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...
- Python--day64--找到作者关联的所有书籍对象、ORM多对多关联查询的原理
找到当前作者关联的所有书籍对象: ORM多对多关联查询的原理: 编辑作者:
- Django(四) ORM 外键操作及初识Ajax
一.内容回顾 1.Django请求的生命周期: 路由系统 -> 视图函数(获取模板+数据 -> 渲染) -> 字符串返回给用户 2.路由系统: /index/ #-> 函数 ...
- Django ORM那些相关操作zi
Django ORM那些相关操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...
随机推荐
- JavaScript创建对象的几种方式总结
ECMA把对象定义为:无序属性的集合,其属性可以包含基本值.对象或者函数. 1. 使用Object构造函数创建对象 创建自定义对象的最简单的方式就是创建一个Object的实例,然后再为它添加属性和方法 ...
- 基于VSCode的vue单文件组件模板设置---一次设置,可爽终生
第一步: 第二步: 第三步: 打开vue.json文件后,如果是初次设置,应该如下图所示,绿色注释部分不用管,注意那两个白色大括号 第四步:在大括号内全部粘贴如下代码,保存即可完成vue模板的设置 & ...
- oracle创建定时任务
一.dmbs_job dbms_job涉及到的知识点 1.创建job: variable jobno number; dbms_job.submit(:jobno, —-job号 'your_pro ...
- Oracle删除当前用户下所有的表的方法1
1.如果有plsql客户端,则可以使用该用户登录,选中所有表 右键Drop即可. 2.如果有删除用户的权限,则可以: ? 1 drop user user_name cascade; 加了cascad ...
- input输入框校验
1.只能输入数字,当输入不符字符删除,光标位置不变 //只能输入数字 function onlyNumTrue(obj){ var reg = /[^\d]/g; var pos = obj.sele ...
- C# dataGridView_CellValueChanged事件
C# 输入完以后立即更新缓冲区(DataGridView CheckBox列checked变化后就触发CellValueChanged事件) 在DataGridView添加如下的事件( Current ...
- Liferay 7.1发布啦
下载地址: https://cdn.lfrs.sl/releases.liferay.com/portal/7.1.0-m1/liferay-ce-portal-tomcat-7.1-m1-20180 ...
- Django与HTML业务基本结合--基本的用户名密码提交方法1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 转: CentOS上安装LAMP之第二步:PHP环境及安装过程报错解决方案(纯净系统环境)
最近有空就配置CentOS系统上的AMP环境,现在配置到PHP环境了 多话不说上传送门:http://blog.csdn.net/zhangatle/article/details/77447653 ...
- C位域的初步了解
以为C中的东西了解的差不多了...今天却是第一次才看到位域这个概念, 闲来无事的时候读起了编程之美,看一个问题的时候有种解答用到了位域, 位域的结构体定义,变量声明和结构体很相似: struct (结 ...