五.1分页--展示所有页码

笑着哭i 提交于 2020-02-02 13:42:47

应该规定每页显示多少条数据,再拿总数据量除每页显示的数据条数就知道到底总共有多少页。

需要的变量:

  最多显示的页码数--max_show = 11  half_show = max_show // 2

  每页显示的数据条数--per_num = 10
  总数据量--all_count = len(users)   #计算users有多长即可
  总页码数---total_num, more = divmod(all_count, per_num) #总数据量除每页数据条数即可--用divmod方法,但注意此法返回的是一个元组,所以我接收两个参数

    total_num是整除的数,more是余数。
  存放li标签的列表--html_list = []
  切片的起始值--start = (current_page - 1) * per_num
  切片的终止值--end = current_page * per_num

1.显示所有页码数:

(1)views.py中:

from django.utils.safestring import mark_safe
users = [{'name':'zhihua{}'.format(i),'pwd':'zh12345{}'.format(i)} for i in range(1,302)]def user_list(request):    per_num = 10 # 每页显示的数据条数    all_count = len(users)# 总数据量    total_num, more = divmod(all_count, per_num)# 总页码数    if more:#如果有余数就让总页码数加等1        total_num += 1    return render(request, 'user_list.html',                  {                      "data": users,                      'total_num': range(1, total_num + 1)#把总页码数传给前端                  }

(2)user_list.html中:

<nav aria-label="Page navigation">    <ul class="pagination">                    {% for num in total_num %} #for循环总页码数生成多个<li>标签                        <li><a href="/user_list/?page={{ num }}">{{ num }}</a></li>#这样地址栏中?page=后直接输入数字即可展示对应第几页                    {% endfor %}                    {{ html_str|safe }}    </ul></nav>

效果如下:

但是数据没有跟着页码变化展示,也就是说页码是9就要只展示第九页的数据。---用切片即可

2.变化展示对应页码的页面数据--列表的切片(只取某一段数据)

第1页数据:切片就是索引 0 到10---只能取到0到9的
第2页数据:切片就是索引10 到20--只能取到10到19的

即:

 切片的起始值:start = (current_page - 1) * per_num    ----当前页码减1再乘10

切片的终止值:end = current_page * per_num

views.py中:

def user_list(request):    try: #为防止别人在地址栏?page=后乱输数字或别的字符,所以做判断并都默认跳到第一页        current_page = int(request.GET.get('page',1)) #当前的页码,默认拿到的是1        if current_page <= 0:            current_page = 1    except Exception as e:  #报错则显示第一页        current_page =1    per_num = 10 # 每页显示的数据条数    all_count = len(users)# 总数据量    total_num, more = divmod(all_count, per_num)# 总页码数    if more:#如果有余数就让总页码数加等1        total_num += 1    #切片的起始值    start = (current_page - 1)* per_num    #切片的终止值    end = current_page * per_num    return render(request, 'user_list.html',                  {                      "data": users[start:end],                      'total_num': range(1, total_num + 1)                  })

效果如下:地址栏页码3时页面内容只展示第三页的数据了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!