分页器

  1. <!--前端-->
  2. {% for book in page_queryset %}
  3. <p>{{ book.title }}</p>
  4. {% endfor %}
  5. {{ page_obj.page_html|safe }}
  1. # 后端
  2. book_list = models.Book.objects.all()
  3. current_page = request.GET.get("page",1)
  4. all_count = book_list.count()
  5. page_obj = Pagination(current_page=current_page,all_count=all_count,per_page_num=10,pager_count=5)
  6. page_queryset = book_list[page_obj.start:page_obj.end]

分页器模板代码

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

utils文件中mypage.py

  1. from app01.utils.mypage import Pagination
  2. def book(request):
  3. book_list = models.Book.objects.all()
  4. current_page = request.GET.get("page",1)
  5. all_count = book_list.count()
  6. page_obj = Pagination(current_page=current_page,all_count=all_count,per_page_num=10)
  7. page_queryset = book_list[page_obj.start:page_obj.end]
  8.  
  9. return render(request,'booklist.html',locals())

views.py

  1. <body>
  2. <div class="container">
  3. <div class="row">
  4. <div class="col-md-8 col-md-offset-2">
  5. {% for book in page_queryset %}
  6. <p>{{ book.title }}</p>
  7. {% endfor %}
  8. {{ page_obj.page_html|safe }}
  9. </div>
  10. </div>
  11. </div>
  12. </body>

前端

Django 序列化组件

什么时候用

  1. 后端想直接将实例化出来的数据对象直接发送给客户端,那么这个时候,就可以用Django给我们提供的序列化方式
  1. # 后端:
  2. def ser(request):
  3. #拿到用户表里面的所有的用户对象
  4. user_list=models.User.objects.all()
  5. #导入内置序列化模块
  6. from django.core import serializers
  7. #调用该模块下的方法,第一个参数是你想以什么样的方式序列化你的数据
  8. ret=serializers.serialize('json',user_list)
  9. return render(request,'index.html',locals())

  10. # 前端得到:
  11. [{"model": "app01.user","pk": 1,"fields":
  12. {"username": "jason","age": 18,"gender": 1}
  13. }......]

bulk_create 批量插入数据(高效)

  1. l = []
  2. for i in range(10000):
  3. l.append(models.Book2(name='第%s本书'%i))
  4. models.Book2.objects.bulk_create(l) # 批量插入数据

choices字段参数

为什么用

  1. 1.对于类型性别,假否,婚否的字段,有固定字段数据的字段可以用choices参数
    2.节省空间,因为存的是数字

如何使用

  1. # models.py文件中:
  2. class User(models.Model):
  3. username = models.CharField(max_length=32)
  4. age = models.IntegerField()
  5. choices = (
  6. (1,'男'),(2,'女'),(3,'其他')
  7. )
  8. gender = models.IntegerField(choices=choices) # 指定choices参数

  9. """
  10. 1 存choice里面罗列的数字与中文对应关系
  11. print(user_obj.get_gender_display())
  12. 只要是choices字段 在获取数字对应的注释 固定语法
  13. get_字段名_display()

  14. 2 存没有罗列出来的数字
  15. 不会报错 还是展示数字
  16. """
  1. # views.py文件中
  2. def userlist(request):
  3. user_obj = models.User.objects.filter(pk=1).first()
  4. gender = user_obj.get_gender_display() # 得到对应的性别注释,如'男'
  1.  

分页器,序列化组件,bulk_create,choices字段的更多相关文章

  1. Django1.0和2.0中的rest_framework的序列化组件之超链接字段的处理

    大家看到这个标题是不是有点懵逼,其实我就是想要一个这样的效果 比如我get一条书籍的数据,在一对多的字段中我们显示一个url,看起来是不是很绚! 下面我们就来实现这么一个东西 首先我们一对多字段中的一 ...

  2. Django框架第九篇--Django和Ajax、序列化组件(serializers)、自定义分页器、模型表choice参数

    Django和Ajax 一.什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”.即使用Javascript语 ...

  3. day11 序列化组件、批量出入、自定义分页器

    day11 序列化组件.批量出入.自定义分页器 今日内容详细 ajax实现删除二次提醒(普通版本) ajax结合第三方插件sweetalert实现二次提醒(样式好看些) ajax如何发送文件数据 aj ...

  4. Django学习——分页器基本使用、分页器终极用法、forms组件之校验字段、forms组件之渲染标签、forms组件全局钩子,局部钩子

    内容 1 分页器基本使用 2 分页器终极用法 3 forms组件之校验字段 1 前端 <!DOCTYPE html> <html lang="en"> &l ...

  5. django 分页器,序列化 ,MTV MVC

    序列化组件## from django.core import serializers # django自带的一个小型的序列化工具# def reg(request):# user_list = mo ...

  6. Django序列化组件与数据批量操作与简单使用Forms组件

    目录 SweetAlert前端插件 Django自带的序列化组件 批量数据操作 分页器与推导流程 Forms组件之创建 Forms组件之数据校验 Forms组件之渲染标签 Forms组件之信息展示 S ...

  7. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

  8. DRF 序列化组件

    Serializers 序列化组件 Django的序列化方法 class BooksView(View): def get(self, request): book_list = Book.objec ...

  9. django rest_framework 序列化组件详解

    为什么要用序列化组件 当我们做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到 ...

随机推荐

  1. 软件素材---linux C语言:向文件末尾进行追加数据

    void AppendDataToFile(char* filePath, char* msg) { // 以附加方式打开可读/写的文件, 如果没有此文件则会进行创建,然后以附加方式打开可读/写的文件 ...

  2. 安装AWX

    1.安装最新版python 2.安装最新版docker 设置国内docker镜像源 curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | ...

  3. [转帖]微软 SQ1 参数一览:8 核 Kryo 495,Adreno 685 GPU

    微软 SQ1 参数一览:8 核 Kryo 495,Adreno 685 GPU http://www.myzaker.com/article/5d989ef68e9f0977765e5506/ 微软发 ...

  4. echo、print和print_r的区别

    1.echo 可以输出一个或多个字符串 ,多个以逗号隔开就行 2.print 也可以输出一个或多个字符串 ,多个要用连接符 3.print_r()可以打印数组:对象 bool print_r ( mi ...

  5. Python【常用的数据类型】

    int,  float,  string整数,浮点数,字符串----------------------------------------字符串(string)用引号括起来的文本 >>& ...

  6. [Luogu5320][BJOI2019]堪破神机(DP+斯特林数)

    https://www.cnblogs.com/cjyyb/p/10747543.html 特征方程+斯特林反演化简式子,要注意在模998244353意义下5没有二次剩余,所以每个数都要用$a+b\s ...

  7. 简介:google ctemplate:简单易用的文字模板(转载)

    转自:http://blog.csdn.net/aladdina/article/details/4531736 CTemplate 是一个简单实用.功能强大的文字模板(template langua ...

  8. PC启动过程详解

    系统启动过程 1. 预引导(Pre-Boot)阶段 2. 引导阶段 3. 加载内核阶段 4. 初始化内核阶段 5. 用户登录阶段 基本概念: BIOS:即“Basic Input/Output Sys ...

  9. html中a标签的4个伪类样式

    在CSS超链接的属性中,有四个连接方式:a:link a:hover a:visited a:acticve 之前在使用的时候一直是按照自认为的顺序中去写的,就是 L H V A的排序方式,然而有些时 ...

  10. vue组件中的data与methods

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> ...