djang分页

分页,其实就是根据用户的输入计算出应该在数据库表中的起始位置,你需要知道如下信息:

1、设定每页显示数据条数

2、用户输入页码(第一页、第二页...),也就是用户选中的页码

3、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置

4、在数据表中根据起始位置取值,页面上输出数据


需求又来了,需要在页面上显示分页的页面。如:[上一页][1][2][3][4][5][下一页]

1、设定每页显示数据条数

2、用户输入页码(第一页、第二页...)

3、设定显示多少页号

4、获取当前数据总条数

5、根据设定显示多少页号和数据总条数计算出,总页数

6、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置

7、在数据表中根据起始位置取值,页面上输出数据

8、输出分页html,如:[上一页][1][2][3][4][5][下一页]

下面写一个简单分页例子:

Page类是定义:通过当前页码,数据总行数,每页显示行数来计算返回的数据的行数和结尾行数得

 

#coding=utf-8
'''
Created on 2016-4-12

@author: leeronggui
'''
from django.utils.safestring import mark_safe
from chat import common

class PageInfo(object):
    '''
    current_page: 当前页数
    count_all: 数据总条数
    pre_page: 每页显示数据行数,默认是5行
    '''
    def __init__(self, current_page, count_all,pre_page=5):
        self.current_page = common.try_int(current_page, 1)
        self.count_all = count_all
        self.pre_page = pre_page
    def start(self):
        '''
        return: 以当前页为中心,返回应该显示的最开始页
        '''
        start = (self.current_page-1)*self.pre_page
        return(start)
    def end(self):
        '''
        return: 以当前页为中心,返回应该显示的最后一页
        '''
        end = self.current_page*self.pre_page
        return end
    def count_page(self):
        '''
        return:总页数
        '''
        temp = divmod(self.count_all, self.pre_page)
        if temp[1] == 0:
            count_page = temp[0]
        else:
            count_page = temp[0] + 1
        return(count_page)


def html_page(page, count_page_num):
    '''
          返回分页的样式
    page:当前页
    count_page_num:总页数
    return:返回一个html大字符串,包含了分页的信息,可以直接返回给前台
    '''
    html_list = []
    first_html = '<a href=/chat/getdata/%d>%s</a>' % (1,'首页')
    html_list.append(first_html)
    if page != 1:
        last_html = '<a href=/chat/getdata/%d>%s</a>' % (page - 1,'上一页')
        html_list.append(last_html)
    if count_page_num < 12:
        start = 0
        end = count_page_num
    else:
        if page < 6:
            start = 0
            end = page + 5
        else:
            if page > count_page_num - 5:
                start = page - 6
                end = count_page_num
            else:
                start = page - 6
                end = page + 5
    for i in range(start,end):
        if page == i + 1:
            html = "<a style='color:red'href=/chat/getdata/%d>%d</a>" % (i+1,i+1)
        else:
            html = '<a href=/chat/getdata/%d>%d</a>' % (i+1,i+1)
        html_list.append(html)
    if page != count_page_num:
        next_html = '<a href=/chat/getdata/%d>%s</a>' % (page + 1,'下一页')
        html_list.append(next_html)
    end_html = '<a href=/chat/getdata/%d>%s</a>' % (count_page_num,'尾页')
    html_list.append(end_html)
    page_html = mark_safe(''.join(html_list))
    return page_html
    

 views.py代码

def getdata(request,page):
    page = common.try_int(page, 1)
    user_items = UserInfo.objects.all()
    count_all = UserInfo.objects.all().count()
    pageinfo = PageInfo(page, count_all)
    show_page = UserInfo.objects.all()[pageinfo.start():pageinfo.end()]
    page_html = html_page(page, pageinfo.count_page())
    ret = {'user_items':show_page,'count': count_all, 'page_html':page_html}
    return render_to_response('getdata.html',ret)

getdata.html代码

<!DOCTYPE html>
    <html>
<head>
    <meta http-equiv="content-type" content="text/html"; charset=utf-8>
    <title>分页</title>
</head>
<body>
    <h1>用户信息列表</h1>
    <table border='1'>
        
        {%for item in user_items%}
        <tr>
            <td>
                {{item.id}}
            </td>
            <td>
                {{item.username}}
            </td>
            <td>
                {{item.gender}}
            </td>
            <td>
                {{item.email}}
            </td>
        </tr>
        {%endfor%}
        </table>
        <div>总条数:{{count}}</div>
        <div>
            {{page_html}}
        </div>
        
</body>
</html>

 

posted @ 2016-04-13 15:25  leeronggui  阅读(171)  评论(0)    收藏  举报