一、ajax结合sweetalter

    1. """
    2. 如果是ajax进行前后端交互,通常后端会返回给ajax一个字典
    3. """
  • ajax结合sweetalter实现点击删除按钮时,弹出提示框,提现用户是否真的要删除,点击”确定“删除,点击”取消“返回。并且在不刷新页面的情况下,不显示被删除的那一行。

  • 首先sweetalter是第三方组件,要先下载导入或者使用cdn的

  • 实例

  • 前端步骤:实例代码中的注释对应下面的4个步骤

    1. 展示完信息后,删除按钮中添加自定义属性来获取当前这条数据的主键值——》

    2. 给删除按钮绑定点击事件,事件函数内部书写模态框代码(模态框代码模板直接从Bootstrap的组件中拷贝,再根据需求修改)——》

    3. 在模态框代码的确定按钮中加入ajax请求。——》

    4. 用户点击模态框中的确定时,执行DOM操作,将我们要删除的那个tr标签移除即可。

  1. # 前端:
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
  8. {% load static %}
  9. <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
  10. <link rel="stylesheet" href="{% static 'dist/sweetalert.css' %}">
  11. <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
  12. <script src="{% static 'dist/sweetalert.min.js' %}"></script>
  13. <style>
  14. div.sweet-alert h2 {
  15. padding: 10px;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div class="container-fluid">
  21. <div class="row">
  22. <div class="col-md-8 col-md-offset-2">
  23. <h2 class="text-center">数据展示</h2>
  24. <br>
  25. <table class="table table-hover table-bordered table-striped">
  26. <thead>
  27. <tr>
  28. <th>序号</th>
  29. <th>用户名</th>
  30. <th>年龄</th>
  31. <th>性别</th>
  32. <th class="text-center">操作</th>
  33. </tr>
  34. </thead>
  35. <tbody>
  36. {% for userObj in user_queryset %}
  37. <tr>
  38. <td>{{ forloop.counter }}</td>
  39. <td>{{ userObj.username }}</td>
  40. <td>{{ userObj.age }}</td>
  41. <td>{{ userObj.get_gender_display }}</td>
  42. <td class="text-center">
  43. <a href="#" class="btn btn-primary btn-sm">编辑</a>
  44. <!--******************** 1.添加自定义属性获取主键值 ***************-->
  45. <a href="#" class="btn btn-danger btn-sm cancel" userId = {{ userObj.pk }}>删除</a>
  46. </td>
  47. </tr>
  48. {% endfor %}
  49. </tbody>
  50. </table>
  51. </div>
  52. </div>
  53. </div>
  54. <script>
  55. <!--******************** 1.绑定点击事件 ***************-->
  56. $('.cancel').click(function () {
  57. var $btn = $(this);
  58. <!--******************** 模态框 ***************-->
  59. swal({
  60. title: "你确定要删吗?",
  61. text: "你如果删了,你就准备好直接跑路吧!",
  62. type: "warning",
  63. showCancelButton: true,
  64. confirmButtonClass: "btn-danger",
  65. confirmButtonText: "是的,老子就要删!",
  66. cancelButtonText: "算了算了,不敢!",
  67. closeOnConfirm: false,
  68. closeOnCancel: false,
  69. showLoaderOnConfirm: true
  70. },
  71. <!--************* 3.在模态框代码的确定按钮中加入ajax请求 ***************-->
  72. function (isConfirm) {
  73. if (isConfirm) {
  74. // 朝后端发送ajax请求
  75. $.ajax({
  76. url:'',
  77. type:'post',
  78. data:{'delete_id':$btn.attr('userId')},
  79. success:function (back_data) {
  80. if(back_data.code==1000){
  81. swal("准备跑路把!", back_data.msg, "success");
  82. <!--********* 4.执行DOM操作,将对应的tr标签移除 ***********-->
  83. $btn.parent().parent().remove()
  84. }else{
  85. swal("有Bug", "发什么了未知的错误!", "warning");
  86. }
  87. }
  88. });
  89. } else {
  90. swal("怂逼", "数据都不敢删", "error");
  91. }
  92. });
  93. })
  94. </script>
  95. </body>
  96. </html>
  97. # 后端:
  98. import time
  99. def home(request):
  100. if request.is_ajax():
  101. back_dic = {'code':1000,'msg':'数据已经被我删掉了'}
  102. delete_id = request.POST.get('delete_id')
  103. time.sleep(3)
  104. models.User.objects.filter(pk=delete_id).delete()
  105. return JsonResponse(back_dic) # 后端返回到前端的json格式数据,前端会自动反序列化成JS对象,因此在上面的ajax回调函数中可以直接使用back_data.code 和 back_data.msg
  106. user_queryset = models.User.objects.all()
  107. return render(request,'home.html',locals())

二、bulk_create批量插入数据

  • django的orm中,当直接批量插入大量数据时,效率非常低,并且会中途中断。

  • 这是django就有一个方法bulk_create,来帮我们实现批量插入数据,这个方法不仅可以成功插入大量数据,且效率也很高。

  • 实例

  1. def index(request):
  2. # for i in range(1000):
  3. # models.Book.objects.create(title='第%s本书'%i) # 直接插入,效率低,中间会中断
  4. book_list = []
  5. for i in range(100):
  6. book_list.append(models.Book(title='第%s书'%i))
  7. # 批量插入数据 建议使用bulk_create方法
  8. models.Book.objects.bulk_create(book_list)

三、简易版分页器推导

1. 推导步骤

  1. 首先获取全部要展示的数据对象,统计总数

    1. all_count = book_queryset.count()
  2. 事先决定每页展示多少条数据,再计算总共分了多少页(使用python自带的取整取余内置方法divmod()

    1. per_page_num = 10 # 每页展示多少条数据
    2. all_count = book_queryset.count()
    3. all_page_num,more = divmod(all_count,per_page_num)
    4. if more:
    5. all_page_num += 1 # 总共分了多少页
    6. # 用户想要查看的页码
    7. current_page = request.GET.get('page', 1)
    8. current_page = int(current_page)
  3. 决定每个页面上展示多少个页码给用户,并是用户每次点击的页码高亮显示且处于这些展示出来的页码的中间。(此时要对最前面的几页和最后面的几页做一个判断,这里我们就只演示对最前面的几页做判断)

    1. # 决定每个页面上展示多少个页码给用户,用户每次点击的页码处于这些展示出来的页码的中间
    2. start_page = (current_page - 1) * per_page_num
    3. end_page = current_page * per_page_num
    4. html = ''
    5. # 对最前面的几页和最后面的几页做一个判断
    6. xxx = current_page
    7. if current_page < 6:
    8. xxx = 6
    9. for i in range(xxx-5,xxx+6):
    10. if current_page == i:
    11. # 用户每次点击的页码高亮
    12. html += '<li class="active"><a href="?page=%s">%s</a></li>'%(i,i)
    13. else:
    14. html += '<li><a href="?page=%s">%s</a></li>' % (i, i)
  4. 确定每页展示哪些数据

    1. book_queryset = book_queryset[start_page:end_page] # 顾头不顾尾(支持索引取值和索引切片)
    2. return render(request, 'index.html', {'xxx':book_queryset})

四、自定义分页器的使用

1. 自定义分页器模板

  1. class Pagination(object):
  2. def __init__(self,current_page,all_count,per_page_num=2,pager_count=11):
  3. """
  4. 封装分页相关数据
  5. :param current_page: 当前页
  6. :param all_count: 数据库中的数据总条数
  7. :param per_page_num: 每页显示的数据条数
  8. :param pager_count: 最多显示的页码个数
  9. 用法:
  10. queryset = model.objects.all()
  11. page_obj = Pagination(current_page,all_count)
  12. page_data = queryset[page_obj.start:page_obj.end]
  13. 获取数据用page_data而不再使用原始的queryset
  14. 获取前端分页样式用page_obj.page_html
  15. """
  16. try:
  17. current_page = int(current_page)
  18. except Exception as e:
  19. current_page = 1
  20. if current_page <1:
  21. current_page = 1
  22. self.current_page = current_page
  23. self.all_count = all_count
  24. self.per_page_num = per_page_num
  25. # 总页码
  26. all_pager, tmp = divmod(all_count, per_page_num)
  27. if tmp:
  28. all_pager += 1
  29. self.all_pager = all_pager
  30. self.pager_count = pager_count
  31. self.pager_count_half = int((pager_count - 1) / 2)
  32. @property
  33. def start(self):
  34. return (self.current_page - 1) * self.per_page_num
  35. @property
  36. def end(self):
  37. return self.current_page * self.per_page_num
  38. def page_html(self):
  39. # 如果总页码 < 11个:
  40. if self.all_pager <= self.pager_count:
  41. pager_start = 1
  42. pager_end = self.all_pager + 1
  43. # 总页码 > 11
  44. else:
  45. # 当前页如果<=页面上最多显示11/2个页码
  46. if self.current_page <= self.pager_count_half:
  47. pager_start = 1
  48. pager_end = self.pager_count + 1
  49. # 当前页大于5
  50. else:
  51. # 页码翻到最后
  52. if (self.current_page + self.pager_count_half) > self.all_pager:
  53. pager_end = self.all_pager + 1
  54. pager_start = self.all_pager - self.pager_count + 1
  55. else:
  56. pager_start = self.current_page - self.pager_count_half
  57. pager_end = self.current_page + self.pager_count_half + 1
  58. page_html_list = []
  59. # 添加前面的nav和ul标签
  60. page_html_list.append('''
  61. <nav aria-label='Page navigation>'
  62. <ul class='pagination'>
  63. ''')
  64. first_page = '<li><a href="?page=%s">首页</a></li>' % (1)
  65. page_html_list.append(first_page)
  66. if self.current_page <= 1:
  67. prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
  68. else:
  69. prev_page = '<li><a href="?page=%s">上一页</a></li>' % (self.current_page - 1,)
  70. page_html_list.append(prev_page)
  71. for i in range(pager_start, pager_end):
  72. if i == self.current_page:
  73. temp = '<li class="active"><a href="?page=%s">%s</a></li>' % (i, i,)
  74. else:
  75. temp = '<li><a href="?page=%s">%s</a></li>' % (i, i,)
  76. page_html_list.append(temp)
  77. if self.current_page >= self.all_pager:
  78. next_page = '<li class="disabled"><a href="#">下一页</a></li>'
  79. else:
  80. next_page = '<li><a href="?page=%s">下一页</a></li>' % (self.current_page + 1,)
  81. page_html_list.append(next_page)
  82. last_page = '<li><a href="?page=%s">尾页</a></li>' % (self.all_pager,)
  83. page_html_list.append(last_page)
  84. # 尾部添加标签
  85. page_html_list.append('''
  86. </nav>
  87. </ul>
  88. ''')
  89. return ''.join(page_html_list)

2. 使用方法

  1. 在app文件夹下新建一个utils文件夹,在utils文件夹下新建一个任意名字的py文件(如:mypage.py)
  2. 将上面的自定义分页器模板代码拷贝到该py文件中
  3. 在需要分页的功能函数中导入from app01.utils.mypage import Pagination

(1)后端代码和前端代码

  • 注意:在前端代码中,将所有的book_queryset对象换成page_queryset对象
  1. # 后端代码:
  2. def index(request):
  3. # 自定义分页器的使用
  4. book_queryset = models.Book.objects.all()
  5. current_page = request.GET.get('page',1)
  6. all_count = book_queryset.count()
  7. page_obj = Pagination(current_page=current_page,all_count=all_count,per_page_num=10,pager_count=5)
  8. page_queryset = book_queryset[page_obj.start:page_obj.end] # 将book_queryset对象赋值给page_queryset
  9. return render(request,'index.html',locals())
  10. # 前端代码:
  11. <!DOCTYPE html>
  12. <html lang="en">
  13. <head>
  14. <meta charset="UTF-8">
  15. <title>Title</title>
  16. <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
  17. {% load static %}
  18. <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
  19. <link rel="stylesheet" href="{% static 'dist/sweetalert.css' %}">
  20. <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
  21. <script src="{% static 'dist/sweetalert.min.js' %}"></script>
  22. </head>
  23. <body>
  24. <div class="container-fluid">
  25. <div class="row">
  26. <div class="col-md-8 col-md-offset-2">
  27. {% for book in page_queryset %} <!--将页面上原本的queryset数据全部换成切片之后的queryset即可-->
  28. <p>{{ book }}</p>
  29. {% endfor %}
  30. {{ page_obj.page_html|safe }}
  31. </div>
  32. </div>
  33. </div>
  34. </body>
  35. </html>

django与ajax:ajax结合sweetalter ,批量插入数据 ;分页器组件的更多相关文章

  1. django ajax 及批量插入数据 分页器

    ``` Ajax 前端朝后端发送请求都有哪些方式 a标签href GET请求 浏览器输入url GET请求 form表单 GET/POST请求 Ajax GET/POST请求 前端朝后端发送数据的编码 ...

  2. Django批量插入数据和分页器

    目录 一.ajax结合sweetalert实现删除按钮动态效果 二.bulk_create批量插入数据 1. 一条一条插入 2. 批量插入 三.自定义分页器 一.ajax结合sweetalert实现删 ...

  3. Django orm 实现批量插入数据

    Django ORM 中的批量操作 在Hibenate中,通过批量提交SQL操作,部分地实现了数据库的批量操作.但在Django的ORM中的批量操作却要完美得多,真是一个惊喜. 数据模型定义 首先,定 ...

  4. [Django高级之批量插入数据、分页器组件]

    [Django高级之批量插入数据.分页器组件] 批量插入数据 模板层models.py from django.db import models class Books(models.Model): ...

  5. django----Sweetalert bulk_create批量插入数据 自定义分页器

    目录 一.Sweetalert使用AJAX操作 二.bulk_create 三.分页器 divmod 分页器组件 自定义分页器的使用 一.Sweetalert使用AJAX操作 ​ sweetalert ...

  6. C#批量插入数据到Sqlserver中的四种方式

    我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...

  7. .Net批量插入数据到SQLServer数据库,System.Data.SqlClient.SqlBulkCopy类批量插入大数据到数据库

    批量的的数据导入数据库中,尽量少的访问数据库,高性能的对数据库进行存储. 采用SqlBulkCopy来处理存储数据.SqlBulkCopy存储大批量的数据非常的高效,将内存中的数据表直接的一次性的存储 ...

  8. sql 中的Bulk和C# 中的SqlBulkCopy批量插入数据 ( 回顾 and 粗谈 )

    通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下.   其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...

  9. Java 批量插入数据(Oracle)

    //批量添加20000条数据用时8秒. try {    String url = "jdbc:oracle:thin:@IP:1521:orcl"; // orcl为数据库的SI ...

随机推荐

  1. springcloud zookeeper+gateway

    搭建springcloud项目的时候以 zookeeper为注册中心  gateway为路由 启动时出现以下报错: ****************************************** ...

  2. 【DSP开发】【Linux开发】Linux下PCI设备驱动程序开发

    PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以Inte ...

  3. C#DataGridView格式化显示单元格的内容

    今天又发现了一个很有用的东西,DataGridView的CellFormating事件 经常从数据库查到的原始数据需要经过转换之后显示在客户端,比如性别,“1”显示“男”,“0”显示“女”,为此经常将 ...

  4. SqlServer中插入数据后如何得到主键ID

    使用@@IDENTITY 例如:insert into student(name,age) values('fanqi',23) select @@identity 使用 OUTPUT inserte ...

  5. Go语言中的数组(九)

    我刚接触go语言的数组时,有点不习惯,因为相对于JavaScript这样的动态语言里的数组,go语言的数组写起来有点不爽. 定义数组 go语言定义数组的格式如下: ]int var 数组名 [数组长度 ...

  6. myeclipse显示db-brower

    myeclipse显示db-brower 这东西怎么调出来? windows->show view->other->db borwser

  7. linux连接Windows系统之项目连接

    在桥接模式下 在linux内需要设置 防火墙关闭 在Windows中连接 linux的ip连接 ***项目 在linux中命令行输入setup-->防火墙配置-->空格-->确定-- ...

  8. HTML(上)

    目录 HTML(上) 浏览器 HTML 什么是HTML HTML的作用 编写HTML的规范 HTML结构 HTML常用标签 HTML标签速记 HTML(上) 浏览器 浏览器也是一个客户端 #这是一个服 ...

  9. vim /etc/security/limits.conf中的hard和soft

    转自:https://blog.csdn.net/zxljsbk/article/details/89153690 "soft" 和 "hard" 的区别sof ...

  10. ElasticSearch工作原理与优化

    elasticsearch设计的理念就是分布式搜索引擎,底层其实还是基于lucene的,通过倒排索引的方式快速查询.比如一本书的目录是索引,然后快速找到每一章的的文本内容这种叫正向索引:而如果一件衣服 ...