删除功能二次确定

删除增加二次确认功能

两种交互方式不能同时使用,使用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

 

posted @ 2021-12-07 19:37  一叶松  阅读(438)  评论(0编辑  收藏  举报