django分页



django分页。

如果机子装的是python2.4的话,不想升级2,6, 在页面上用到第三方分页插件,可能会包些小问题,这时,可以用django的官方分页,下面是views.py中的代码
def fengye(request):
       userid=request.session['uid']
        users=User.objects.get(id=userid)
        apps = App.objects.filter(userid=users).order_by(“-id”)
        if not apps:
            err = ‘您当前没有应用程序,请建立一个新应用程序!’
        appth = apps.__len__()
        after_range_num = 5       #当前页前显示5页
        befor_range_num = 4      #当前页后显示4页
        try:                     #如果请求的页码少于1或者类型错误,则跳转到第1页
            page = int(self.request.GET.get(“page”,1))
            if page < 1:
                page = 1
        except ValueError:
            page = 1
        paginator = Paginator(apps,10)   # 设置apps在每页显示的数量,这里为10
        try:                     #跳转到请求页面,如果该页不存在或者超过则跳转到尾页
            apps_list = paginator.page(page)
        except(EmptyPage,InvalidPage,PageNotAnInteger):
            apps_list = paginator.page(paginator.num_pages)
        if page >= after_range_num:
            page_range = paginator.page_range[page-after_range_num:page+befor_range_num]
        else:
            page_range = paginator.page_range[0:int(page)+befor_range_num]
        return render_to_response(‘html/myapp.html’,locals(),RequestContext(self.request))
页面上展示:
<div align=”right”>
<table align=”right” ><tr>
<td>共{{appth}}条   第{{ apps_list.number }}/{{ apps_list.paginator.num_pages }}页&nbsp;&nbsp; </td>
{% if apps_list.has_previous %}
<td><a href=”/myapp/?page=1″ ><img src=”/site_media/imgs/page-first.jpg”/></a></td>
<td><a href=”/myapp/?page={{ apps_list.previous_page_number }}”><img src=’/site_media/imgs/page-prev.jpg’/></a></td>
{% else %}
<td><img src=”/site_media/imgs/page-first.jpg”/></td>
<td><img src=’/site_media/imgs/page-prev.jpg’/></td>
{% endif %}
{% if apps_list.has_next %}
<td><a href=”/myapp/?page={{ apps_list.next_page_number }}”> <img src=’/site_media/imgs/page-next.jpg’/> </a></td>
<td><a href=”/myapp/?page={{apps_list.paginator.num_pages}}” ><img src=’/site_media/imgs/page-last.jpg’/></a></td>
{% else %}
<td><img src=’/site_media/imgs/page-next.jpg’/> </td>
<td><img src=’/site_media/imgs/page-last.jpg’/></td>
{% endif %}
<td>
<input type=”text” size=1 id=”pages” name=”page”/></td>
<td>
<img onclick=”if ( document.getElementById(‘pages’).value &gt; {{apps_list.paginator.num_pages}} )window.location.href=’/myapp/?page={{apps_list.paginator.num_pages}}’;else if (document.getElementById(‘pages’).value == 0) window.location.href=’/myapp/?page=1′;else window.location.href=’/myapp/?page=’+document.getElementById(‘pages’).value;” src=’/site_media/imgs/page-skip.jpg’”>&nbsp;&nbsp;
</td>
</tr></table>
</div>
其中:

aginator对象 类Paginator: class Paginator(object_list,per_page,orphans=0,allow_empty_first_page=True) 必须提供的参数: object_list:一个列表或元组,元素是django QuerySet或是包含count()或__len__()方法的可切片对象。 per_page:包含在一页中最多的条目数量。 可选参数: orphans:在最后一页中充许的最少条目数量,默认是0.当最后一页条目数量小于或等于orphans时,这些条目加到本页的上一页中。 allow_empty_first_page:是否充许第一页为空。如设为False且object_list为空,则抛出EmptyPage异常。

方法 Paginator.page(number):返回一个Page对象,序号是始于1.如给出的页号不存在,抛出InvalidPage异常。

属性 Paginator.num_pages:页面总页数 Paginator.page_range:页面数的范围,始于1,如[1,2,3,4]。

InvalidPage异常 如要求的页面无效或页面中没有对象,page()抛出InvalidPage异常。


PageNotAnInterger:当提供给page()的数不是整数是抛出该异常。 EmptyPage:当提供给page()的数是一个有效数,但在该页没有对象存在时,抛出该异常。

Page对象

class Page(object_list,number,paginator): 一般不手工创建Pages,可以使用Paginator.page().

方法: Page.has_next():如有下一页则返回True Page.has_previous():如有上一页则返回True Page.has_other_pages():如有上一页或下一页返回True Page.next_page_number():返回下一页的页码。不管下一页是否存在都返回。 Page.previous_page_number():返回上一页的页码。不管上一页是否存在都返回。 Page.start_index():返回当前页面中第一个对象的序号,序号始于1.例如:将一个包含5个对象的列表分成每页2个对象,则第二页的start_index()返回3. Page.end_index():返回当前页面中最一个对象的序号。

属性 Page.object_list:当前页面中所有的对象 Page.number:当前页面的页码,始于1 Page.paginator:页面相关的Pageinator对象。