Django 分页功能

自定义分页

view视图函数:

def index_page(request,page):  #分页视图
    display_linkpage_count = 5   #页面下方展示的页面选项数量
    display_item = 10   #每页显示数据条目
    count = Host.objects.all().count()  #数据库中总条数
    all_page, current_page, start_item, end_item = postion(count, display_item, page)
    #调用postion函数处理
    result = Host.objects.all()[start_item:end_item]  #获取当前页要展示的数据
    current_count= Host.objects.all()[start_item:end_item].count() #当前页显示数据条目

    page_html = pager(current_page, all_page,display_linkpage_count)  #调用自定义分页函数
    ret = {'data':result,'count':count,'current_count':current_count,'page_html':page_html}
    return render(request,'ajax_app/index.html',ret)

路由:

url(r'^index_page/(?P<page>\d*)', views.index_page, name='index_page')

两个自定义的函数:

from django.utils.safestring import mark_safe  #把字符串安全输出到前端
def postion(count,display_item,page):
    all_page = int((count + display_item - 1) / display_item)  # 总页数,向上取整数,如5/2为3
    try:
        current_page = int(page)
        if current_page <= 0:  # 如果为负数,则默认为1
            current_page = 1
        elif current_page > all_page:
            current_page = all_page
    except Exception, e:
        current_page = 1  # 当前页ID,默认为1
    finally:
        pass
        #    Host.objects.all()获取到的数据返回为列表,从0开始
        #    0--9    Host.objects.all()[0:10] 前10个数据
        #    10--19  Host.objects.all()[10:20]
        #    20--29  Host.objects.all()[20:30]
    start_item = (current_page - 1) * display_item
    end_item = current_page * display_item
    return all_page,current_page,start_item,end_item

def pager(current_page,all_page,display_linkpage_count):  #自定义分页
    #current_page为当前页,all_page为总页数,display_linkpage_count为下方要显示的页数链接
    temp_html = []
    first_html = "<a href='/ajax_app/index_page/%d'>首页</a>" % (1)
    temp_html.append(first_html)
    if current_page <=1:
        prev_html = "<a href='#'>上一页</a>"
    else:
        prev_html = "<a href='/ajax_app/index_page/%d'>上一页</a>" % (current_page - 1)
    temp_html.append(prev_html)

    begin = current_page - (display_linkpage_count / 2)
    end = current_page + (display_linkpage_count / 2)

    if all_page <= display_linkpage_count:  #当总页数小于下方要显示的页数链接
        begin = 1
        end = all_page
    else:
        if begin == 0:
            end = current_page + (current_page - begin + 1)
            begin = 1
        elif begin < 0:
            end = current_page + (current_page - begin + 1)+1
            begin = 1
        elif end > all_page:
            begin = current_page - (end - current_page + 1)
            end = all_page

    for i in range(begin,end+1):
        if current_page == i:
            a_html = "<a href='/ajax_app/index_page/%d' style='color: chartreuse'>%d</a>" % (i,i) #如果是当前页,则显示绿色
        else:
            a_html = "<a href='/ajax_app/index_page/%d'>%d</a>" % (i, i)
        temp_html.append(a_html)

    if current_page >= all_page:
        next_html = "<a href='#'>下一页</a>"
    else:
        next_html = "<a href='/ajax_app/index_page/%d'>下一页</a>" % (current_page+1)
    temp_html.append(next_html)
    end_html = "<a href='/ajax_app/index_page/%d'>尾页</a>" % (all_page)
    temp_html.append(end_html)
    temp_str = mark_safe('-'.join(temp_html))  # 使用mark_safe方法静态输出字符串,使用join方法将列表连接为字符串
    return temp_str

 html页面:

<body>
    <h1>主机信息</h1>
    <table border="1">
        <tr>
            <td>主机名</td>
            <td>IP地址</td>
        </tr>
        {% for item in data %}
        <tr>
            <td>{{ item.hostname }}</td>
            <td>{{ item.IP }}</td>
        </tr>
        {% endfor %}
    </table>
    <div>
            <td>{{ page_html }}</td>
    </div>
    <div>当前页条数:{{ current_count }}</div>
    <div>总条数:{{ count }}</div>
</body>

 

猜你喜欢

转载自www.cnblogs.com/honey-badger/p/8948169.html