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>
浙公网安备 33010602011771号