Django 分页的简单实现

来源:互联网 发布:毛笔字软件中文版 编辑:程序博客网 时间:2024/06/04 19:06

 

Django 分页的简单实现

  1. def list(request):  
  2.     after_range_num = 5  
  3.     bevor_range_num = 4  
  4.     try:  
  5.         page = int(request.GET.get("page",1))  
  6.         print('page----->',page)  
  7.         if page < 1:  
  8.             page = 1  
  9.     except ValueError:  
  10.         page = 1  
  11.       
  12.     info = Article.objects.order_by('id').all()  
  13.     paginator = Paginator(info,3)  
  14.       
  15.       
  16.     try:  
  17.         articleList = paginator.page(page)  
  18.     except(EmptyPage,InvalidPage,PageNotAnInteger):  
  19.         articleList = paginator.page(1)  
  20.     print('articleList---->',articleList.object_list)  
  21.     #显示范围  
  22.     if page >= after_range_num:  
  23.         page_range = paginator.page_range[page-after_range_num:page+bevor_range_num]  
  24.     else:  
  25.         page_range = paginator.page_range[0:int(page)+bevor_range_num]  
  26.     return render_to_response("blogsite/list.html",locals())  

以上是分页的controller.html代码如下: 
{% if info %}
{% for article in articleList.object_list %}
<div class="article">
<div class="title">-----<a href='/blogsite/{{ article.id }}'>{{ article.title }}</a></div>
</div>
{% endfor %}
{% else %}
<p>对不起没有文章奥!</p>
{% endif %}
<hr>
{% if has_previous %}
<a href="/?page={{ previous }}">上一页</a>
{% endif %}
{% if has_next %}
<a href="/?page={{ next }}"></a>
{% endif %}
<hr>
{% if articleList.has_previous %}
<a href="?page={{ articleList.previous_page_number }}" title="下一页">上一页</a>&nbsp;
{% endif %}
{% for p in page_range %}
{% ifequal p articleList.number %}
<span>{{p}}</span>
{% else %}
<a href="?page={{p}}" title="第{{p}}页">{{p}}</a>
{% endifequal %}
{% endfor %}
&nbsp;
{% if articleList.has_next %}
<a href="?page={{ articleList.next_page_number }}" title="下一页">下一页</a>&nbsp;
{% endif %}
 

Paginator对象
类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对象。

 

 

 

 

>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)

>>> p.count
4
>>> p.num_pages
2
>>> p.page_range
[1, 2]

>>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul']

>>> page2 = p.page(2)
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
>>> page2.next_page_number()
3
>>> page2.previous_page_number()
1
>>> page2.start_index() # The 1-based index of the first item on this page
3
>>> page2.end_index() # The 1-based index of the last item on this page
4

>>> p.page(0)
...
EmptyPage: That page number is less than 1
>>> p.page(3)
...
EmptyPage: That page contains no results

 

 

原创粉丝点击