删除功能二次确定
两种交互方式不能同时使用,使用ajax进行交互时,原来的交互方式要删除
# 普通版本(使用原生js方法)
页面刷新的两种方式
window.location.reload() // 刷新页面()
# 先要使用 let $this = $(this) 重新赋值
$this.parent().parent().remove() // js代码自动刷新
# 进阶版本(使用第三方插件)
复制粘贴加修改
"""ajax的url参数也是支持反向解析的"""
普通版本简单代码
# 前端
<body>
<a href="#" class="btn btn-success btn-danger d1" del_id="{{ foo.pk }}">删除</a>
# class标签d1 del_id自定义标签(支持自定义标签),后面的是删除对象的主键值
</body>
# js代码
<script>
let $c1 = $('.d1') # 获取class标签为d1的所有数据
$c1.on('click',function(){ # 建立一个点击事件
let del_id = $(this).attr('del_id') # $(this)表示当前操作的标签,获取del_id字段的值
res = confirm('你确定要删除吗') # 返回值res,确定返回true,取消返回false
if (res){
$.ajax(){ # 与前端进行交互
url:'/data_del/',
type:'post',
data:{'del_id':del_id} # 交互的数据内容
success:function(args){ # function里面是后端返回的内容
alert(args)
window.location.reload() # 刷新页面
}
}
}
})
</script>
# 后端代码
def data_del(request):
if request.is_ajax():
if request.method == 'POST':
del_data = request.POST.get('del_id') # 获取ajax传过来的数据
models.Book.objects.filter(pk=del_data).delete()
return HttpResponse('已经删完了,赶紧跑路')
ajax如何发送文件数据
# ajax发送文件数据
$('#b1').click(function () {
// ajax发送携带文件数据的请求 需要借助于内置对象FormData
# 1.先生成一个FormData对象
let formDataObj = new FormData();
# 2.往该对象中添加数据(支持普通数据和文件数据)
formDataObj.append('name',$('#i2').val()); # 获取普通数据.val()
formDataObj.append('pwd',$('#i3').val());
# 获取文件数据 有固定的语法格式
formDataObj.append('file',$('#i1')[0].files[0]); # 获取文件数据,固定搭配
// 发送ajax请求
$.ajax({
url:"/ab_file/",
type:'post',
// 发送文件需要额外配置的两个参数
contentType:false, # aja
processData: false,
data:formDataObj,
success:function () {
}
})
})
dataType参数
"""前后端交互 如果采用的是ajax 那么后端的返回值应该使用字典(json格式)"""
1、如果后端使用HttpResponse返回需要将字典格式序列化成json格式
json.dumps(dict),此时前端收到的是一个json格式的字符串,如果想要变成一个json对象,后端需要对数据做反序列化处理JSON.parse
如果不想自己处理可以添加dataType:"JSON"参数
$.ajax(function(){
url:'',
type:'',
data:'',
dataType:"JSON",
success:function(args){
}
})
2、如果后端是采用JsonResponse返回json格式数据则无需我们自己处理也不需要添加
dataType:"JSON"参数(加了也不影响)
from djando.http import JsonResponse
dict = {}
return JsonResponse('dict')
# 以后推荐加上 增加程序兼容性
序列化模块serializers
需求:把从数据库中查找到的数据转化成列表套字典的形式返回给前端
data = models.Books.objects.all()
#(此时的数据格式是queryset格式)可以看成是列表套数据对象的形式
方法一:
from django.http import JsonResponse
def ab_ser(request):
data = models.Books.objects.all()
new_list = []
for obj in data: # 数据对象
temp_dict = {}
temp_dict['table'] = 'app01.Books'
temp_dict['pk'] = obj.pk
temp_dict['title'] = obj.title
temp_dict['price'] = obj.price
temp_dict['publish_name'] = obj.publish_name
new_list.append(temp_dict)
return JsonResponse(new_list, safe=False)
# 使用JsonResponse格式返回数据时,列表需要加个safe=False参数,字典不需要
但如果有多个字段,显然这个方法不适用
方式二:使用serializers模块
from django.core import serializers
def ab_ser(request):
data = models.Books.objects.all()
# 调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
ret = serializers.serialize('json', data) # DRF的前身
return HttpResponse(ret)
可以通过bejson转化格式(网上搜索)
批量插入数据
在表中批量插入数据
def ab_bc(request):
# 循环创建十万本书籍数据
1、使用for循环
for i in range(100000): # 不推荐此法 效率极低
models.Book.objects.create(title='第%s本书'%i)
2、new_obj_list = []
for i in range(100000):
# 仅仅是用类产生了对象 并没有操作数据库
book_obj = models.Book(title='第%s本新的书'%i)
'''上述代码 如果对象很多的情况下 比较浪费空间'''
优化:
new_obj_iter = (models.Book(title='第%s本新的书'%i) for i in range(100000)) # 生成器(只有向它要数据时,才会产生数据,节省空间)
models.Book.objects.bulk_create(new_obj_iter) # 批量插入
# 查询数据
data_queryset = models.Book.objects.all()
return render(request,'ab_bc.html',locals())
分页
# 要求:掌握推导思路即可
思路:
当展示数据较多时,我们可以限制传给后端的数据个数来实现分页
即每页展示多少个数据
models.Books.objects.all()[0:10]
start_page # 切片起始页
end_page # 切片结束页
per_page_num # 每页展示个数
current_page # 当前页码
以每页展示10个数据为例
下面需要研究current_page、per_page_num、start_page、end_page四个参数之间的数据关系
per_page_num = 10
current_page start_page end_page
1 0 10
2 10 20
3 20 30
4 30 40
per_page_num = 5
current_page start_page end_page
1 0 5
2 5 10
3 10 15
4 15 20
可以很明显的看出规律
start_page = (current_page - 1) * per_page_num
end_page = current_page* per_page_num
内置方法之divmod
>>> divmod(100,10) # 商和余数
(10, 0) # 10页
>>> divmod(101,10)
(10, 1) # 11页
>>> divmod(99,10)
(9, 9) # 10页
# 余数只要不是0就需要在第一个数字上加一
我们可以判断元祖的第二个数字是否为0从而确定到底需要多少页来展示数据
book_queryset = models.Book.objects.all()
all_count = book_queryset.count() # 数据总条数(len(book_queryset))
all_pager, more = divmod(all_count, per_page_num)
if more: # 有余数则总页数加一
all_pager += 1
"""参考博客"""
地址:https://www.cnblogs.com/Dominic-Ji/articles/12035722.html