在 user_manager 项目下创建一个 python package:utils,里面创建一个 page.py 文件

page.py 文件内容为:

  1. # 创建一个 PagerHelper 类
  2. class PagerHelper:
  3. # 创建对象需要至少传入3个参数
  4. def __init__(self, total_count, current_page, base_url, per_page=10):
  5. self.total_count = total_count
  6. self.current_page = current_page
  7. self.base_url = base_url
  8. self.per_page = per_page
  9. # 计算切片起始页数
  10. @property
  11. def db_start(self):
  12. return (self.current_page - 1) * self.per_page
  13. # 计算切片最后页数
  14. @property
  15. def db_end(self):
  16. return self.current_page * self.per_page
  17. # 计算总共有多少页
  18. def total_page(self):
  19. v, a = divmod(self.total_count, self.per_page)
  20. if a != 0:
  21. v += 1
  22. return v
  23. # 返回构造后的页码 html 页面代码
  24. def pager_str(self):
  25. # 获取总共页数
  26. v = self.total_page()
  27. # 存放 html 代码
  28. pager_list = []
  29. # 判断 上一页 是否到顶部
  30. if self.current_page == 1:
  31. pager_list.append('<a href="java:script(0)">上一页</a>')
  32. else:
  33. pager_list.append('<a href="%s?p=%s">上一页</a>' % (self.base_url, self.current_page - 1,))
  34. # 这里为了美观,页面只显示 11 个
  35. # 如果总页数少于11,则定义起始切片和末尾切片数为固定
  36. if v <= 11:
  37. pager_range_start = 1
  38. pager_range_end = v + 1
  39. # 总页数大于11的情况
  40. else:
  41. # 当前页数小于 6
  42. if self.current_page < 6:
  43. pager_range_start = 1
  44. pager_range_end = 11 + 1
  45. else:
  46. pager_range_start = self.current_page - 5
  47. pager_range_end = self.current_page + 5 + 1
  48. # 当前页数大于总页数,对起始切片和末尾切片数重新赋值
  49. if pager_range_end > v:
  50. pager_range_start = v - 10
  51. pager_range_end = v + 1
  52. for i in range(pager_range_start, pager_range_end):
  53. # 给当前页码添加 class
  54. if i == self.current_page:
  55. pager_list.append('<a class="active" href="%s?p=%s">%s</a>' % (self.base_url, i, i))
  56. else:
  57. pager_list.append('<a href="%s?p=%s">%s</a>' % (self.base_url, i, i))
  58. # 判断 下一页 是否到底部
  59. if self.current_page == v:
  60. pager_list.append('<a href="java:script(0)">下一页</a>')
  61. else:
  62. pager_list.append('<a href="%s?p=%s">下一页</a>' % (self.base_url, self.current_page + 1,))
  63. # 字典转化为字符串
  64. pager = "".join(pager_list)
  65. return pager

修改 views.py 文件

  1. @auth
  2. def handle_classes(request):
  3. if request.method == "GET":
  4. current_user = request.session.get('username')
  5. # 获取所有的班级列表
  6. # for l in range(1, 102):
  7. # models.Classes.objects.create(caption='全栈一班%i' %(l))
  8. current_page = request.GET.get('p', 1)
  9. current_page = int(current_page)
  10. # 所有数据的个数
  11. total_count = models.Classes.objects.all().count()
  12. # 导入 PagerHelper 类
  13. from utils.page import PagerHelper
  14. # 传入初始化参数:总记录,当前页码,url,每页显示几条数据
  15. obj = PagerHelper(total_count, current_page, '/classes.html', 5)
  16. # 获得构建页码的 html 代码
  17. pager = obj.pager_str()
  18. # 获取数据库中指定的
  19. 记录
  20. cls_list = models.Classes.objects.all()[obj.db_start:obj.db_end]
  21. return render(request,
  22. 'classes.html',
  23. {'username': current_user, 'cls_list': cls_list, 'str_pager': pager})
  24. elif request.method == "POST":
  25. # Form 表单提交的处理方式
  26. """
  27. caption = request.POST.get('caption', None)
  28. models.Classes.objects.create(caption=caption)
  29. return redirect('/classes.html')
  30. """
  31. # Ajax 提交的方式处理
  32. import json
  33. response_dict = {'status': True, 'error': None, 'data': None}
  34. caption = request.POST.get('caption', None)
  35. if caption:
  36. obj = models.Classes.objects.create(caption=caption)
  37. # print(obj.id)
  38. # print(obj.caption)
  39. response_dict['data'] = {'id': obj.id, 'caption': obj.caption}
  40. else:
  41. response_dict['status'] = False
  42. response_dict['error'] = "标题不能为空"
  43. return HttpResponse(json.dumps(response_dict))

classes.html 内容为:

  1. {% extends "layout.html" %}
  2. {% block css %}
  3. {% endblock %}
  4. {% block content %}
  5. <h1>班级管理</h1>
  6. <div>
  7. <input id="id_add" type="button" value="添加">
  8. <a href="/add_classes.html">添加</a>
  9. </div>
  10. <table border="1">
  11. <thead>
  12. <tr>
  13. <th>ID</th>
  14. <th>标题</th>
  15. </tr>
  16. </thead>
  17. <tbody>
  18. {% for item in cls_list %}
  19. <tr>
  20. <td>{{ item.id }}</td>
  21. <td>{{ item.caption }}</td>
  22. <td>
  23. <a>编辑</a>|<a class="td-delete">删除</a>
  24. </td>
  25. </tr>
  26. {% endfor %}
  27. </tbody>
  28. </table>
  29. <div class="pagination">
  30. {{ str_pager|safe }}
  31. </div>
  32. <div class="modal hide">
  33. <form method="post" action="/classes.html">
  34. {% csrf_token %}
  35. <input name="caption" type="text" placeholder="标题">
  36. <input id="id_modal_cancel" type="button" value="取消">
  37. <input type="submit" value="确定">
  38. <input type="button" id="modal_ajax_submit" value="Ajax确定">
  39. </form>
  40. </div>
  41. <div class="shade hide"></div>
  42. <div class="remove hide">
  43. <input id="id_remove_cancel" type="button" value="取消">
  44. <input type="button" value="确定">
  45. </div>
  46. {% endblock %}
  47. {% block js %}
  48. <script>
  49. $(function () {
  50. $('#menu_class').addClass('active');
  51. bindAddEvent();
  52. bindCancelEvent();
  53. bindTdDeleteEvent();
  54. bindSubmitModal();
  55. })
  56. function bindAddEvent() {
  57. $('#id_add').click(function () {
  58. $('.modal, .shade').removeClass('hide')
  59. })
  60. }
  61. function bindCancelEvent() {
  62. $('#id_modal_cancel').click(function () {
  63. $('.modal, .shade').addClass('hide')
  64. })
  65. }
  66. function bindTdDeleteEvent() {
  67. /* 新建的 td 没有绑定 click 事件
  68. $('td .td-delete').click(function () {
  69. $('.remove, .shade').removeClass('hide')
  70. })
  71. */
  72. // 使用 js 的事件绑定委托
  73. $('tbody').on('click', '.td-delete', function () {
  74. $('.remove, .shade').removeClass('hide')
  75. })
  76. }
  77. function bindSubmitModal() {
  78. $('#modal_ajax_submit').click(function () {
  79. var value = $('.modal input[name="caption"]').val();
  80. $.ajax({
  81. url: "/classes.html",
  82. type: 'POST',
  83. data: {caption: value},
  84. dataType: "JSON",
  85. success: function (rep) {
  86. if(!rep.status){
  87. alert(rep.error)
  88. }else{
  89. // 通过刷新整个界面来显示新数据
  90. //location.reload();
  91. // 通过js 在 table 表格最后追加一行数据,追加的数据就是当前增加的数据
  92. var tr = document.createElement('tr');
  93. var td1 = document.createElement('td');
  94. td1.innerHTML = rep.data.id;
  95. var td2 = document.createElement('td');
  96. td2.innerHTML = rep.data.caption;
  97. var td3 = document.createElement('td');
  98. td3.innerText = "|";
  99. var a1 = document.createElement('a');
  100. a1.innerHTML = "编辑";
  101. var a2 = document.createElement('a');
  102. a2.className = "td-delete";
  103. a2.innerHTML = "删除";
  104. $(td3).prepend(a1);
  105. $(td3).append(a2);
  106. $(tr).append(td1);
  107. $(tr).append(td2);
  108. $(tr).append(td3);
  109. $('table tbody').append(tr);
  110. $('.modal, .shade').addClass('hide');
  111. }
  112. }
  113. })
  114. })
  115. }
  116. </script>
  117. {% endblock %}

Django 练习班级管理系统三 -- 分页的更多相关文章

  1. Django 练习班级管理系统二 -- 添加班级数据

    在上一篇中(Django 练习班级管理系统一 https://www.cnblogs.com/klvchen/p/11078174.html),使用的是莫泰对话框的方式提交数据,适用于数据量少的操作. ...

  2. Django 练习班级管理系统六 -- 编辑老师列表

    修改 views.py @auth def edit_teacher(request, nid): if request.method == "GET": obj = models ...

  3. Django 练习班级管理系统四 -- 编辑班级

    修改 classes.html {% extends "layout.html" %} {% block css %} {% endblock %} {% block conten ...

  4. Django 练习班级管理系统七 -- 编辑老师列表(二)

    修改 views.py @auth def edit_teacher(request, nid): if request.method == "GET": obj = models ...

  5. Django 练习班级管理系统五 -- 查看老师列表

    models.py 对应的配置 class Classes(models.Model): caption = models.CharField(max_length=32) class Teacher ...

  6. Django 练习班级管理系统八 -- 上传文件

    Form表单上传文件 修改 views.py import os def upload(request): if request.method == 'GET': img_list = models. ...

  7. Django - Xadmin (三) 分页、搜索和批量操作

    Django - Xadmin (三) 分页.搜索和批量操作 分页和 ShowList 类 因为 list_view 视图函数里面代码太多,太乱,所以将其里面的用于处理表头.处理表单数据的关键代码提取 ...

  8. Django学习笔记(三)—— 型号 model

    疯狂暑期学习 Django学习笔记(三)-- 型号 model 參考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'defaul ...

  9. Django的admin管理系统写入中文出错的解决方法/1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation ‘locate’

    Django的admin管理系统写入中文出错的解决方法 解决错误: 1267  Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and ( ...

随机推荐

  1. 渗透测试之wep无线网络破解

    WEP 无线网络破解 WEP(无线等效协议)于 1999 年诞生,并且是用于无线网络的最古老的安全标准.在 2003 年,WEP 被 WPA 以及之后被 WPA2 取代.由于可以使用更加安全的协议,W ...

  2. Python—实现ssl认证

    https://blog.csdn.net/vip97yigang/article/details/84721027 https://www.cnblogs.com/lsdb/p/9397530.ht ...

  3. 5-6 可视化库Seaborn-Facetgrid使用和绘制多变量

      基本工作流程是FacetGrid使用数据集和用于构造网格的变量初始化对象.然后,可以通过调用FacetGrid.map()或将一个或多个绘图函数应用于每个子集 FacetGrid.map_data ...

  4. win10python安装iis

    django部署iis https://www.cnblogs.com/guangang/articles/9268644.html python部署iis https://www.cnblogs.c ...

  5. django获取某一个字段的列表 values values_list flat=true

    1.values() print(Question.objects.values('title')) #得到的是一个字典 <QuestionQuerySet [{'title': '查询优化之s ...

  6. C++ try catch 示例代码

    #include<iostream> void f1() { throw std::string("error happen"); } void f2() { try ...

  7. java加密类

    java.security.KeyStore KeyStore ks = KeyStore.getInstance(type); KeyStore ks = KeyStore.getInstance( ...

  8. CF-378 B.Semifinals

    题目意思:有n个参赛者,他们都需要参加两场半决赛.第一场半决赛的成绩依次是a1, a2, ..., an,分别对应第1-第n个人的成绩.第二场则是b1, b2, ..., bn.其中这两个序列都是以递 ...

  9. webpack与vue环境搭建(转载)

    原文:https://www.cnblogs.com/lgx5/p/10732016.html npm安装教程   一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理 ...

  10. LeetCode 234:回文链表 Palindrome Linked List

    ​ 请判断一个链表是否为回文链表. Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: ...