首页 > 代码库 > django分页技术django-pagination和Paginator

django分页技术django-pagination和Paginator

转载前还请注明出处:http://blog.csdn.net/gugugujiawei

一、概述

几乎所有的web应用,都需要分页功能,但分页技术总体来说分两种,一种是全部加载,存于浏览器的缓存中,一种是分页访问,部分加载。前一种方法优点是实现简单,在一些对项目要求不多的特定应用上用得较多,可以利用的插件譬如datatables,而后一种方法优点是不会占用服务器太多的缓存,对于数据量大的列表项必须用到这种技术。由于我现在的项目属于管理后台,管理来自成千上万用户的数据,因而只能用到第二种方法。初期开发的时候没想那么多,直接用datatables插件就搞定了(datatables插件是个不错的插件哦,改进之应该可以用在第二种方法中)。


二、django的分页部分加载

在最开始的调研中,想利用boostrap Paginator,不过感觉不是很好用,优点是网上资源多,想做得很炫可以考虑一下。之后发现django-pagination。

1、django-pagination

这是一个python包,来自github上的一个项目,很容易用。参考http://www.cnblogs.com/bbcar/p/3521103.html

不过这是一个懒人工具,好吧(工具理性)。不过当一个页面有多处需要采用分页的话,就行不通了,要么修改django-pagination的源码,改变它的url指向,不过我没研究,当工程涉及到迁移时,要知道要安装各种东西本来就是个缺点,还要再修改源码,那就得不偿失。因而转战django自带的分页插件——Paginator。

2、Paginator

先看看效果

技术分享

感觉还勉强可以吧。要更加牛X的功能自行Google咯。

views.py

#coding:utf-8
from django.shortcuts import render_to_response,RequestContext
from django.http import HttpResponse
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

def middleware_review(req):
        midware=[1,2,3]
        midware_review=[1,2,3]
	limit=10
	page_midware=Paginator(midware,limit)
	page_midware_review=Paginator(midware_review,limit)
	page=req.GET.get('page')
	table=req.GET.get('table','none')
	try:
		if table=='1':
			midware=page_midware.page(page)
		else:
			midware=page_midware.page(1)
	except PageNotAnInteger:
		midware=page_midware.page(1)
	except EmptyPage:
		midware=page_midware.page(page_midware.num_pages)
	try:
		if table=='2':
			midware_review=page_midware_review.page(page)
		else:
			midware_review=page_midware_review.page(1)
	except PageNotAnInteger:
		midware_review=page_midware_review.page(1)
	except EmptyPage:
		midware_review=page_midware_review.page(page_midware_review.num_pages)
	return render_to_response('middleware-review.html',{'midware':midware,'midware_review':midware_review},context_instance=RequestContext(req))
table的作用是为了区分同一个页面不同的分页。

  my.html

取数据操作为:

{% for u in midware.object_list %}
{%  endfor %}

在需要插入分页标签的地方,插入代码:

<div style="float:right">       
<span style="white-space:pre">	</span>{%  include "pages/midware.html" %}
</div> 
       当然,这里直接将midware.html原封不动搬过来也是可以的,不过为了解耦,就另新建一个文件夹pages放分页的html。

       midware.html

<ul class="pagination">{% if midware.has_previous %}    <li><a href=http://www.mamicode.com/"?table=1&&page={{ midware.previous_page_number }}" class="prev">{{ previous_link_decorator|safe }}上一页>
table的作用就体现在这里了。当然我是受http://blog.csdn.net/zgyulongfei/article/details/8842338启发,第一次加载才查找整个数据库,也是挺好的啦~

其实在写这个分页栏时,一直在思考一个问题:怎样复用midware.html代码,因为这部分代码只有两个地方不一样,一是从view传过来的对象名,二是table值,大部分时间在弄这个,采取现在这种方法也是迫不得已。

尝试过这些方法:

1、读进去一个html文件,替换其中的字符串,如midware,table。试过document.write,innerHtml,$(‘#id‘).html()这些用于javascript与html文件的操作。大体思路是读进一个文件字符串,或者一个DOM对象,然后利用replace,再write到一个div中或者调用$(‘#id‘).html()。

2、利用js文件,在js文件中格式已经是字符串的情况,当在my.html进行调用的时候,传入js参数,再写回my.html的div中,这种方法成功了。但终于发现问题的本质(感觉)——是不可能实现的。

因为,当浏览器访问django的时候,传回html文件,再传回{{}}和{% %}等东西,之后再调用javascript代码,任何采用javascript代码的操作都略显迟。

因此最后只能每个分页栏写一个html,如果有谁有其他好方法还请不吝赐教哈。感觉如果django自带的{% include ‘html‘ %}方法如果这时如果有一个传参的功能多好。


django分页技术django-pagination和Paginator