最近做一个分页的功能,网上很多资料都说用Paginator类来实现。可是看了一些例子,觉得这种分页方式在数据量非常大的情况下,效率会变得非常低下:
这里我们需要多少数据,从数据库中查询多少数据,在数据量很大的下,大大的提升了效率。
废话不多说,直接上代码:
python views.py
ONE_PAGE_OF_DATA = 3
try:
curPage = int(request.GET.get('curPage', '1'))
allPage = int(request.GET.get('allPage', '1'))
pageType = str(request.GET.get('pageType'))
except ValueError:
curPage = 1
allPage = 1
pageType = ''
# 判断点击【上一页】还是【下一页】
if pageType == 'pageDown':
curPage += 1
elif pageType == 'pageUp':
curPage -= 1
startPos = (curPage - 1) * ONE_PAGE_OF_DATA
endPos = startPos + ONE_PAGE_OF_DATA
user_list = User.objects.all()[startPos:endPos]
print user_list
if curPage == 1 and allPage == 1:
allPostCounts = User.objects.count()
print allPostCounts
allPage = allPostCounts / ONE_PAGE_OF_DATA
print allPage
remainPost = allPostCounts % ONE_PAGE_OF_DATA
print remainPost
if remainPost > 0:
allPage += 1
return render(request,'userinfo.html', {'user_list':user_list, 'allPage': allPage, 'curPage': curPage})
userinfo.html代码:
<tbody> {% for line in user_list %} <tr> <td>{{ line.id }}</td> <td>{{ line.username }}</td> <td>{{ line.identity}}</td> <td>{{ line.email }}</td> <td>{{ line.tel}}</td> <td>{{ line.create_time|date:"Y-m-d H:i:s" }}</td> </tr> {% endfor %} </tbody> {% ifnotequal curPage 1 %} <a href="?curPage={{ curPage }}&&allPage={{ allPage }}&&pageType=pageUp"> 上一页 </a> {% endifnotequal %} 第{{ curPage }}/{{ allPage }}页 <!-- 如果当前是最后一页,就不显示【下一页】链接 --> {% ifnotequal curPage allPage %} <a href="?curPage={{ curPage }}&&allPage={{ allPage }}&&pageType=pageDown"> 下一页 </a> {% endifnotequal %}
浙公网安备 33010602011771号