首页 > 其他分享 >ajax 结合sweetalert实现二次确认效果,ajax批量插入数据:bulk_create()

ajax 结合sweetalert实现二次确认效果,ajax批量插入数据:bulk_create()

时间:2024-03-25 15:12:01浏览次数:32  
标签:obj swal create bulk ajax user id delete

ajax结合sweetalert实现二次确认

二次确认效果: http://lipis.github.io/bootstrap-sweetalert/

<body>
<div class="container-fluid">
    <h1 class="text-center">数据展示</h1>
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <table class="table-striped table table-hover">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>姓名</th>
                        <th>年纪</th>
                        <th>性别</th>
                        <th>描述</th>
                    </tr>
                </thead>

                <tbody>
                    {% for user_obj in user_request %}
                        <tr>
                            <td>{{ user_obj.pk }}</td>
                            <td>{{ user_obj.username }}</td>
                            <td>{{ user_obj.age }}</td>
                            <td>{{ user_obj.get_gender_display }}</td>
                            <td>{{ user_obj.gender }}</td>
                            <td>
                                <button class="btn btn-toolbar btn-xs">编辑</button>
                                <!--注意,绑定ajax事件在for循环中不能加id,每for循环一次出现一个按钮,
                                如果绑定id就意味着for循环后出现的按钮id值一致,使用class=del

                                我们需要实现用户点击删除按钮,后端能够知道用户到底要删那条数据,
                                后端怎么知道?主键。
                                自定义属性
                                -->
                                <button class="btn btn-danger btn-xs del" delete_id="{{ user_obj.pk }}">删除</button>
                            </td>
                        </tr>
                    {% endfor %}
                    
                </tbody>
            </table>
        </div>
    </div>

<script>
    $('.del').on('click',function (){
        alert(123)
    })
</script>


好了,使我们需要取引入第三方模块,二次确认。

swal({
  title: "Are you sure?",
  text: "You will not be able to recover this imaginary file!",
  type: "warning",
  showCancelButton: true,
  confirmButtonClass: "btn-danger",
  confirmButtonText: "Yes, delete it!",
  cancelButtonText: "No, cancel plx!",
  closeOnConfirm: false,
  closeOnCancel: false
},
function(isConfirm) {
  if (isConfirm) {
    swal("Deleted!", "Your imaginary file has been deleted.", "success");
  } else {
    swal("Cancelled", "Your imaginary file is safe :)", "error");
  }
});

其中有些信息可以修改。

<script>
    $('.del').on('click',function (){
        //attr 获取标签中属性所对应的值
        {#alert($(this).attr('delete_id'))#}
        //二次确认弹框
        swal({
              title: "确定删除??",
              text: "你他娘的再想想!!!",
              type: "warning",
              showCancelButton: true,
              confirmButtonClass: "btn-danger",
              confirmButtonText: "我就要删!",
              cancelButtonText: "不,我不想删!",
              closeOnConfirm: false,
              closeOnCancel: false
            },
            function(isConfirm) {
              if (isConfirm) {
                swal("已删除!", "你个吊毛", "success");
              } else {
                swal("怂逼", "在这装JB毛", "error");
              }
            });
    })
</script>


在确认删除会发现第三方模块的导入可能不兼容,可手动修改。

<style>
    div.sweet-alert h2 {
        padding-top: 15px;
    }
</style>

前端该有的都有了,现在开始操作。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css">
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

    {% load static %}
    <link rel="stylesheet" href="{% static 'dist/sweetalert.css' %}">
    <script src="{% static 'dist/sweetalert.js' %}"></script>

    <style>
        div.sweet-alert h2 {
            padding-top: 15px;
        }
    </style>

</head>
<body>
<div class="container-fluid">
    <h1 class="text-center">数据展示</h1>
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <table class="table-striped table table-hover">
                <thead>
                    <tr>
                        <th>ID</th>
                        <th>姓名</th>
                        <th>年纪</th>
                        <th>性别</th>
                        <th>描述</th>
                    </tr>
                </thead>

                <tbody>
                    {% for user_obj in user_request %}
                        <tr>
                            <td>{{ user_obj.pk }}</td>
                            <td>{{ user_obj.username }}</td>
                            <td>{{ user_obj.age }}</td>
                            <td>{{ user_obj.get_gender_display }}</td>
                            <td>{{ user_obj.gender }}</td>
                            <td>
                                <button class="btn btn-toolbar btn-xs">编辑</button>
                                <!--注意,绑定ajax事件在for循环中不能加id,每for循环一次出现一个按钮,
                                如果绑定id就意味着for循环后出现的按钮id值一致,使用class=del
                                我们需要实现用户点击删除按钮,后端能够知道用户到底要删那条数据,
                                后端怎么知道?主键。
                                自定义属性
                                -->
                                <button class="btn btn-danger btn-xs del" delete_id="{{ user_obj.pk }}">删除</button>
                            </td>
                        </tr>
                    {% endfor %}
                    
                </tbody>
            </table>

        </div>
    </div>

<script>
    $('.del').on('click',function (){
        //先将当前标签对象存储,用变量指代当前被点击对象
        let currentBtn = $(this);
        //二次确认弹框
        swal({
              title: "确定删除??",
              text: "你他娘的再想想!!!",
              type: "warning",
              showCancelButton: true,
              confirmButtonClass: "btn-danger",
              confirmButtonText: "我就要删!",
              cancelButtonText: "不,我不想删!",
              closeOnConfirm: false,
              closeOnCancel: false
            },
            //isConfirm 判断用户有没有点击二次确认删除按钮
            function(isConfirm) {
              if (isConfirm) {
                  // 朝后端发送ajax请求删除数据之后,后端判断是否有数据,再谈下面的提示框,
                  $.ajax({
                      // 向delete/user/发送ajax请求,并携带需要产出数据的主键值,传递主键值第一种方式
                      {#url:'/delete/user/' + currentBtn.attr('delete_id'),#}
                      // 传递主键值第二种方式,放在请求体中
                      url:'/delete/user/',
                      type:'post',
                      data:{'delete_id':currentBtn.attr('delete_id')},
                      success:function (args){
                            //判断响应状态码做不同的处理。
                          if (args.code === 1000){
                              swal("已删除!", "你个吊毛", "success");
                              // 2.利用DOM操作,动态刷新
                              // 当前端点击删除,后端找到标签所在行,通过DOM操作删除此行,
                              // delete_id 上一个标签是td,再上一个标签为tr,需要删的是当前标签delete_id所在的这一行。

                              // currentBtn指代的是当前被操作对象,parent()拿到父标签,两个parent()拿到父标签的父标签
                              currentBtn.parent().parent().remove()
                          }else {
                              swal("怂逼", "在这装JB毛", "info");
                          }
                      }
                  })

              }
              else {
                swal("怂逼", "在这装JB毛", "error");
              }
            });
    })
</script>

</div>
</body>
</html>
<script>
    $('.del').on('click',function (){
        //先将当前标签对象存储,用变量指代当前被点击对象
        let currentBtn = $(this);
        //二次确认弹框
        swal({
              title: "确定删除??",
              text: "你他娘的再想想!!!",
              type: "warning",
              showCancelButton: true,
              confirmButtonClass: "btn-danger",
              confirmButtonText: "我就要删!",
              cancelButtonText: "不,我不想删!",
              closeOnConfirm: false,
              closeOnCancel: false
            },
            //isConfirm 判断用户有没有点击二次确认删除按钮
            function(isConfirm) {
              if (isConfirm) {
                
                  //朝后端发送ajax请求删除数据之后,后端判断是否有数据,再谈下面的提示框,
                  $.ajax({
                    
                      //向delete/user/发送ajax请求,并携带需要产出数据的主键值,传递主键值第一种方式
                      {#url:'/delete/user/' + currentBtn.attr('delete_id'),#}
          
                      //传递主键值第二种方式,放在请求体重
                      url:'/delete/user/',
                      type:'post',
                      data:{'delete_id':currentBtn.attr('delete_id')},
                        
                      // 形参args接收后端发来的值,args = {'code':'','msg':''}
                      success:function (args){
                        
                            //判断响应状态码做不同的处理。
                          if (args.code === 1000){
                              swal("已删除!", "你个吊毛", "success");
                              // 删除后需要重载整个页面,不推荐
                              {#window.location.reload()#}
                              // 2.利用DOM操作,动态刷新
                              // 当前端点击删除,后端找到标签所在行,通过DOM操作删除此行,
                              // delete_id 上一个标签是td,再上一个标签为tr,需要删的是当前标签delete_id所在的这一行。

                              // currentBtn指代的是当前被操作对象,parent()拿到父标签,两个parent()拿到父标签的父标签
                              currentBtn.parent().parent().remove()
                          }else {
                              swal("怂逼", "在这装JB毛", "info");
                          }
                      }

                  })

              }
              else {
                swal("怂逼", "在这装JB毛", "error");
              }
            });
    })
</script>

后端逻辑代码:

def delete_user(request):
    """
    前后端在使用ajax进行交互的时候,后端通常给ajax回调函数返回一个字典格式的数据
    字典返回到前端就是一个自定义对象,前端可以通过.的方式拿到想要的数据
    :param request:
    :return:
    """
    if request.is_ajax():
        if request.method == 'POST':
            # code:1000 为响应状态码
            back_dic = {'code':1000,'msg':''}
            # 取到前端返回用户想要删除数据的主键值
            delete_id = request.POST.get('delete_id')
            models.User.objects.filter(pk=delete_id).delete()
            back_dic['msg'] = '数据已删除'
            # 需要告诉前端操作的结果
            return JsonResponse(back_dic)

ajax批量插入数据:bulk_create()

def pl(request):
    # 先将book插入10000条数据
    for i in range(10000):
        models.Book.objects.create(title='第%s本书' % i)
    # 再将所有的数据查询并返回给前端页面
    book_queryset = models.Book.objects.all()
    return render(request,'pl.html',locals())
class Book(models.Model):
    title = models.CharField(max_length=32)
{% for book_obj in book_queryset %}
    <p>{{ book_obj.title }}</p>
{% endfor %}

此时前端可以接收到数据,但是加载时间至少需要五秒以上,太慢了。

使用bulk_create():

def pl(request):
    book_list = []
    for i in range(1000):
        book_obj = models.Book(title='第%s本书' % i)
        book_list.append(book_obj)
    models.Book.objects.bulk_create(book_list)
    return render(request,'pl.html',locals())

结论:耗时一秒左右,使用批量操作用 bulk_create()

标签:obj,swal,create,bulk,ajax,user,id,delete
From: https://www.cnblogs.com/HeroZhang/p/18094411

相关文章

  • Ajax 发送json格式数据以及发送文件(FormData)和自带的序列化组件: serializers
    前后端传输数据的编码格式(contentType)get请求数据就是直接放在url?后面的url?usernmae=junjie&password=123...可以向后端发送post请求的方式form请求ajax请求前后端传输数据的编码格式urlencodedformdatajson研究form表单:默认的数据编码格式是(urlencod......
  • 【WEEK4】 【DAY4】AJAX - Part One【English Version】
    2024.3.21ThursdayContents8.AJAX8.1.Introduction8.2.Simulatingajax8.2.1.Createanewmodule:springmvc-06-ajax8.2.2.Addwebsupport,importpomdependencies8.2.2.1.Modifyweb.xml8.2.2.2.Createajspfolder8.2.3.CreateapplicationContext.xml......
  • Python编程—Ajax数据爬取
    Python编程—Ajax数据爬取​在浏览器中可以看到正常显示的页面数据,而使用requests得到的结果中并没有这些数据。这是因为requests获取的都是原始HTML文档,而浏览器中的页面是JavaScript处理数据后生成的结果,这些数据有多种来源:可能是通过Ajax加载的,可能是包含在HTML文档中......
  • Ajax、JSON、响应式设计和Node.js
    Ajax、JSON、响应式设计和Node.js股票搜索(AJAX/JON/HTML5/Bootstrap/Angular/Node.js/CloudExercise)1.目标●熟悉AJAX和JSON技术●在客户端使用HTML5、Bootstrap和Angular的组合●在服务器端使用Node.js●熟悉Bootstrap,使用响应式设计增强用户体验●亲身体验云服务托......
  • Vue学习笔记56--vue常用Ajax库(axios)
    vue常用Ajax库:1.vue-resource插件库npmivue-resource使用方式略,不建议使用,vue1.x使用广泛,官方已不维护2.axios通用的Ajax请求库,官方推荐,使用广泛axios在Vue项目中可以用来向后台发送请求(调接口API),获取响应信息的一个方法。Axios 是一个基于 promise 的 HTTP 库,可以......
  • AJAX 前端开发利器:实现网页动态更新的核心技术
    AJAXAJAX是开发者的梦想,因为你可以:在不重新加载页面的情况下更新网页在页面加载后请求来自服务器的数据在页面加载后接收来自服务器的数据在后台向服务器发送数据HTML页面<!DOCTYPEhtml><html><body><divid="demo"><h2>让AJAX更改这段文字</h2><buttontype=......
  • html页面中如何发送ajax请求
    ajax简介Ajax,全称“AsynchronousJavaScriptandXML”(异步JavaScript和XML),是一种用于创建交互式网页应用的网页开发技术。它允许浏览器与服务器之间进行异步数据交互,可以在不重新加载整个页面的情况下,更新页面的部分内容。AJAX的关键技术XMLHttpRequest(简称XHR):这是浏览器......
  • vue的vite、vue-cli、create-vue的区别
     脚手架:创建项目,选择性安装需要的插件,指定统一的风格,生成demo。构建项目:建立项目的运行环境,需要手动安装插件。 vue-cli【官网:https://cli.vuejs.org/zh/index.html】VueCLI的包名称由vue-cli改成了@vue/clivue-cli是Vue早期推出的一款脚手架,使用webpack......
  • 什么是AJAX?如何使用AJAX实现异步数据传输?
    AJAX,全称为AsynchronousJavaScriptAndXML,是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,允许在不重新加载整个页面的情况下,对网页的某部分进行更新。在JavaScript中,我们可以使用XMLHttpRequest对象来实现AJAX。下面是......
  • Elasticsearch-批量操作(bulk)
    bulk的基础概念bulk是es提供的一种批量增删改的操作API。bulk的语法bulk对JSON串的有着严格的要求。每个JSON串不能换行,只能放在同一行,同时,相邻的JSON串之间必须要有换行(Linux下是\n;Window下是\r\n)。bulk的每个操作必须要一对JSON串(delete语法除外)。PUT/_bulk{"action":......