django-普通分页

views.py 代码:

def person_page(request):
    # 从URL中取出参数page,这个参数是"?page=1"形式
    cur_page_num = request.GET.get('page')
    # 取得PrettyNum中的记录总数
    total_count = models.PrettyNum.objects.all().count()
    # 设定每一页显示多少条记录
    one_page_lines = 10
    # 页面上总共展示多少页码标签
    page_maxtag = 9
    """
    根据总记录数,计算出总的页数
    通过divmod函数取得商和余数,有余数时,总页数是商加1
    同时判断当前页的页码是否大于总页数,如果大于总页数,设置当前页码等于最后一页的页码
    """
    total_page,remainder=divmod(total_count,one_page_lines)
    if remainder:
        total_page += 1
    try:
        # 参数page传递过来的是字符类型数值,因此需要转化为整数类型
        cur_page_num = int(cur_page_num)
        # 如果输入的页码超过了超过了最大的页码,设置当前页码是最后一页的页码
        if cur_page_num > total_page:
            cur_page_num = total_page
    except Exception as e:
        # 当输入的页码不是正整数或者不是数字时,设置当前页码是第一页的页码
        cur_page_num = 1
    # 定义两个变量,指定表中当前页的记录开始数,以及当前页的记录结束数
    rows_start = (cur_page_num-1)*one_page_lines
    rows_end = cur_page_num*one_page_lines
    # 如果页数小于每页设置的页码标签数,设置每页页码标签数为总页数
    if total_page<page_maxtag:
        page_maxtag=total_page
    # 把当前页码标签放在中间,前面放一半页码标签,后面放一半页码标签
    # 因此先把设置的页码标签数除以2
    half_page_maxtag = page_maxtag//2
    # 页面上页码标签的开始数
    page_start = cur_page_num - half_page_maxtag
    # 页面上页码标签的结束数
    page_end = cur_page_num + half_page_maxtag
    """
    如果计算出的页码标签开始数小于1,页面中页码标签设置从1开始
    设置页面中页码标签结束数等于前面设置的页码标签总数page_maxtag
    """
    if page_start <=1:
        page_start =1
        page_end=page_maxtag
    """
    如果计算出的页码标签数比总页码数大,设置最后的页码标签数为总页数
    设置页面中页码开始数等于总页数减去page_maxtag加1
    """
    if page_end >= total_page:
        page_end = total_page
        page_start = total_page-page_maxtag + 1
        if page_start <= 1:
            page_start = 1
    # 对PrettyNum表中的记录进行切片,取出属于本页的记录
    per_list = models.PrettyNum.objects.all()[rows_start:rows_end]
    # 初始化一个列表变量,用来保存拼接分页的HTML代码
    html_page = []
    # 首页代码
    html_page.append('<li><a href="/person_page/?page=1">首页</a></li>')
    # 上一页页码标签的HTML代码,如果当前是第一页,设置上一页页码标签为非可用状态
    if cur_page_num <=1:
        html_page.append('<li class="disabled"><a href="#"><span aria-hidden="true">«</span></a></li>'.format(
            cur_page_num-1))
    else:
        # 上一页页码标签的HTML代码
        html_page.append('<li><a href="/person_page/?page={}"><span aria-hidden="true">«</span></a></li>'.format(
            cur_page_num - 1))
    # 依次取页码标签
    for i in range(page_start,page_end+1):
        # 如果等于当前页就加一个active类
        if i == cur_page_num:
            html_temp = '<li class="active"><a href="/person_page/?page={0}">{0}</a></li>'.format(i)
        else:
            html_temp = '<li><a href="/person_page/?page={0}">{0}</a></li>'.format(i)
        html_page.append(html_temp)
    # 下一页页码标签的HTML页码
    # 判断如果是最后一页,下一页设为disabled
    if cur_page_num >= total_page:
        html_page.append('<li class="disabled"><a href="#"><span aria-hidden="true">»</span></a></li>')
    else:
        html_page.append(
            '<li><a href="/person_page/?page={}"><span aria-hidden="true">»</span></a></li>'.format(
                cur_page_num + 1))
    # 最后一页页码标签的html代码
    html_page.append(
        '<li><a href="/person_page/?page={}">尾页</a></li>'.format(total_page))
    # 把HTML连接起来
    page_nav = ''.join(html_page)
    return render(request,'list.html',{'person_list':per_list,'page_nav':page_nav})

 

HTMl 代码:

<div class="panel panel-default">
        <div class="panel-heading">
            <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
            用户列表
        </div>
        <table class="table table-bordered">
        {% csrf_token %}
            <thead>
                <tr>
                    <td>ID</td>
                    <td>手机号</td>
                    <td>价格</td>
                    <td>级别</td>
                    <td>状态</td>
                    <td>操作</td>
                </tr>
            </thead>
            <tbody>
                {% for pe in person_list %}
                    <tr>
                        <td>{{ pe.id }}</td>
                        <td>{{ pe.mobile }}</td>
                        <td>{{ pe.price }}</td>
                        <td>{{ pe.get_level_display }}</td>
                        <td>{{ pe.get_status_display }}</td>
                      <td>
                            <a class="btn btn-primary btn-xs" href="/pretty_edit/{{ pe.id }}">编辑</a>
                            <a class="btn btn-danger btn-xs" href="/pretty_del/{{ pe.id }}">删除</a>
                        </td>
                    </tr>
            {% endfor %}
            </tbody>
        </table>

    </div>
  <!--分页代码-->
        <nav aria-label="Page navigation">
            <ul class="pagination">
                <!-- 用模板过滤标签,防止对HTMl 代码转义-->
                {{ page_nav|safe }}
            </ul>
        </nav>
</div>

  

posted @ 2023-09-07 22:28  jakub  阅读(23)  评论(0)    收藏  举报