Loading... 上一节了解了分页器的基本方法 还有两个方法没具体说明是什么意思 `start_index` `end_index` ``` >>> page2.start_index() # The 1-based index of the first item on this page 3 >>> page2.end_index() # The 1-based index of the last item on this page 4 ``` 官方文档没给中文,翻译过来有点怪,不好理解,这里就画一张图  我没想到,实际应用的场景,暂时做了解 ## 展示固定页数 按实际场景来说,下方是某一个网站的列表页分页,后面显示一共有285页  我们之前的写法是,直接for循环遍历完,那么就会有285个按钮,这对用户体验来讲,非常糟糕 当我们翻阅到第5页时,则只展示了前两页和后两页的按钮  我们也来实现这一个功能 假定用户说,我要访问第5页,那么你应该展示: 3 , 4 , 5, 6 ,7 简单的数据关系 ``` current_page_num = 5 range(current_page_num-2, current_page_num+3) ``` 这样就取到了3, 7之间的所有数字 再思考个问题,当当前页`current_page_num`等于`1`的时候呢? 取出来的范围就是`(-1, 3)`,显然我们的页数是没有`-1`的 所以需要特殊处理一下,如果出现`<=0`的情况,我们都让其等于`1` `max(current_page_num-2, 1)`取最大值 同样的问题还有尾页 `min(总页数, current_page_num+2)` 所以最后确定的范围就是 ``` range(max(current_page_num-2, 1), min(总页数+1, current_page_num+2+1)) ``` 实例代码: ```python def blog(request): # 获取页码参数 context = {} page_num = request.GET.get('page', 1) blogs_all = Blog.objects.all() paginator = Paginator(blogs_all, settings.NUMBER_OF_EACH_PAGE) page_of_blogs = paginator.get_page(page_num) # 获取当前页码 current_page_num = int(page_num) # 获取当前页面,前后两页码 current_page_range = list(range(max(current_page_num-2, 1), min(paginator.num_pages+1, current_page_num+3))) # ... ``` ## 显示首页和尾页 还需完成无论当前页是多少,都可以跳转到首页或者尾页  首页肯定是`1` 尾页就是总页数 ```python # 加上首页和尾页 if current_page_range[0] != 1: current_page_range.insert(0, 1) if current_page_range[-1] != paginator.num_pages: current_page_range.append(paginator.num_pages) ``` 最后加上省略号 如果直接从`1`就跳到`4`,显得比较突兀,所添加一个省略号在中间,并且是不可点击的  ```python if current_page_range[0] - 1 >= 2: current_page_range.insert(0, '...') if paginator.num_pages - current_page_range[-1] >= 2: current_page_range.append('...') ``` ## 灵活控制每页文章数 在前面分页,一页的数量多少是直接写死的 我们可以在全局配置文件`setting.py`进行自定义的设置 在文件最后添加 ```pyhton # 自定义参数 NUMBER_OF_EACH_PAGE = 1 ``` 然后在视图文件中引入这个变量 ``` from django.conf import settings # 引用变量 settings.NUMBER_OF_EACH_PAGE ``` Last modification:April 24th, 2020 at 04:09 pm © 允许规范转载