针对上一小节批量插入的数据,我们在前端展示的时候发现一个很严重的问题,一页展示了所有的数据,数据量太大,查看不方便
针对数据量大但又需要全部展示给用户观看的情况下,我们统一做法都是做分页处理
首先我们需要明确的时候,get请求也是可以携带参数的,所以我们在朝后端发送查看数据的同时可以携带一个参数告诉后端我们想看第几页的数据
其次我们还需要知道一个点,queryset对象是支持索引取值和切片操作的,但是不支持负数索引情况
接下来我们就可以推导我们的自定义分页器步骤了
| current_page = request.GET.get("page",1) |
| try: |
| current_page = int(current_page) |
| except Exception as e: |
| current_page = 1 |
| |
| per_page_num = 10 |
| |
| |
| start_page = ? |
| end_page = ? |
| """ |
| 下面需要研究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 |
| """ |
当我问你下面几个问题的时候,你的内心肯定是鄙视的,不信的话那就请听题
问题1:总数据有100条,每页展示10条,总共需要几页?
答案:10条
问题2:总数据有101条,每页展示10条,总共需要几页?
答案:11条
问题3:如何通过代码算出到底需要多少条?
答案:去你妹的,不会!!!
| >>> divmod(100,10) |
| (10, 0) |
| >>> divmod(101,10) |
| (10, 1) |
| >>> divmod(99,10) |
| (9, 9) |
| |
我们可以判断元祖的第二个数字是否为0从而确定到底需要多少页来展示数据
| book_queryset = models.Book.objects.all() |
| all_count = book_queryset.count() |
| all_pager, more = divmod(all_count, per_page_num) |
| if more: |
| all_pager += 1 |
至此分页器大致的功能及思路我们就已经大致清楚了
最后我们只需要利用start_page和end_page对总数据进行切片取值再传入前端页面就能够实现分页展示
| book_list = models.Book.objects.all()[start_page:end_page] |
| return render(request,'booklist.html',locals()) |
接下来就是前端页面的代码编写了
| {% for book in book_list %} |
| <p>{{ book.title }}</p> |
| {% endfor %} |
现在我们实现了最简单的分页,但是前端没有按钮去让用户点击需要看第几页,所以我们需要渲染分页器相关代码,这里我们不做要求直接去bootstrap框架拷贝代码即可