博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django中的分页
阅读量:4053 次
发布时间:2019-05-25

本文共 5308 字,大约阅读时间需要 17 分钟。

Django分页参考官方文档:

 

现在我的分页和forloop产生冲突,forloop.counter第一页显示正常,第二页还是从1开始计数,初步判定是DWZ框架的问题。问题如下图所示:

 

Django 1.0 中分页机制和先前已经大不相同。它提供了一些类协助你把数据分页。 对应的文件为 django/core/paginator.py

举例¶

类Paginator,带两个构造参数,一个就是数据的集合,另一个表示每页放几个数据。

>>> 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

Note

Paginator 的第一个参数可以是list,tuple,QuerySet 或者任意对象————只要它 有count() 或者 __len__() 函数。 Django后台会先尝试调用 count()``。如果 不可行,再定要 ``len()

在视图中使用 Paginator

下面是一个复杂点的分页例子。也就是把查询子集在视图中分页显示。下面演示了如何结合视图 view,模板template来显示结果。前提是假设``Contacts`` model 已经被导入。

视图view 函数:

from django.core.paginator import Paginator, InvalidPage, EmptyPage

def listing(request):

contact_list = Contacts.objects.all()

paginator = Paginator(contact_list, 25) # Show 25 contacts per page

# Make sure page request is an int. If not, deliver first page.

try:

page = int(request.GET.get('page', '1'))

except ValueError:

page = 1

# If page request (9999) is out of range, deliver last page of results.

try:

contacts = paginator.page(page)

except (EmptyPage, InvalidPage):

contacts = paginator.page(paginator.num_pages)

return render_to_response('list.html', {"contacts": contacts})

在模板文件 TE<list.htmlTE< 中,将显示每个对象的一些信息,以及导航标记。:

{% for contact in contacts.object_list %}

{# Each "contact" is a Contact model object. #}

{

{ contact.full_name|upper }}<br />

...

{% endfor %}

<div class="pagination">

<span class="step-links">

{% if contacts.has_previous %}

<a href="?page={

{ contacts.previous_page_number }}">previous</a>

{% endif %}

<span class="current">

Page {

{ contacts.number }} of {
{ contacts.paginator.num_pages }}.

</span>

{% if contacts.has_next %}

<a href="?page={

{ contacts.next_page_number }}">next</a>

{% endif %}

</span>

</div>

构造函数:

Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)

必传参数¶

object_list
一个list,tuple,django的QuerySet,或者拥有``count()``或``__len__()``方法的 可分解对象。
per_page
每一页最大的对象个数。

可选参数¶

orphans
最后一页对象的最少数目,默认为0。 如果想避免最后一页显示太少。则可以使用这个值。 那么最后一页的数据,自动被前移一页。比如总共23个数据。每页显示 10.
orphans=3 那么,第一页为10,第二页为13.
allow_empty_first_page
表示首页是否可以为空,如果是
False 而且``object_list`` 为空,那么会触发
EmptyPage 异常。

方法¶

Paginator.page(number)

根据索引number,返回一个’Page’对象,如果不存在,引起 InvalidPage异常

属性¶

Paginator.count

所有对象的总数, 尝试通过``object_list.count()``和``object_list.__len__()`` 取得

Paginator.num_pages

总共的页数

Paginator.page_range

页的范围,比如
[1, 2, 3, 4]

InvalidPage 异常¶

当页面不存在或者无效时,会引起``InvalidPage``异常,一般这个异常就够用,如果需要更 详细信息,还有``PageNotAnInteger``,``EmptyPage``可用:

PageNotAnInteger
page() 的参数非整数。
EmptyPage
page(x) ,第x页没数据。

上述两个都是 InvalidPage 的子类。 用一个简单的 except InvalidPage 就可以处理。

Page 类¶

Page(object_list, number, paginator):

一般不需用户自己构造,通过`Paginator.page` 生成。

方法¶

Page.has_next()

如果下一页存在,返回True。

Page.has_previous()

如果前一页存在返回
True

Page.has_other_pages()

如果上一页面或者下一页存在,返回``True``

Page.next_page_number()

返回下一页的索引,这个函数比较傻(不管下一页是否存在,都是简单的+1)

Page.previous_page_number()

返回上一页的索引,其他同上

Page.start_index()

返回当前页,第一个对象的索引。

Page.end_index()

道理同上。

属性¶

Page.object_list

当前页对象列表

Page.number

当前页的索引

Page.paginator

和page相关的分页类

我的心得:

1. 第一步

contact_list = Contacts.objects.all()

paginator = Paginator(contact_list, 25) # Show 25 contacts per page

得到一个Paginator对象。通过其构造方法实现

第二步:通过这个对象来得到一个Page对象出来。因为

Page的对象有如下的方法及属性

Page.has_next() 分页用

当前页的数据集为:

Page.object_list 当前数据集!我们就是去读取这个数据集中的内容出来!

来自己写一个测试页面试下

 

 

包含import相关类from django.core.paginator import Paginator, InvalidPage, EmptyPage。

  接着,设置分页属性,paginator=Paginator(数据列表, 每页数据量)。

  于是就可以获得各种相关的属性:

  总页数:paginator.num_pages

 

  总记录数: paginator.count

 

  页的范围: paginator.page_range, 比如 [1, 2, 3, 4]

  页数据(list): page.object_list 

 

  当前页码: page.number、

  以及相关的方法:

  是否有下页:page.has_next(), True/False

 

是否有上页:page.has_previous()

 

下一页的页码:page.next_page_number()

 

上一页的页码:page.previous_page_number()

 

当前页第一个对象: page.start_index()

 

当前页最后一个对象: page.end_index()

 

我所使用的view.py中的代码:

    paginator = Paginator(ret, 1)

    try:

        page = int(request.GET.get('page', '1'))

    except ValueError:

        page = 1

    try:

        contacts = paginator.page(page)

    except (EmptyPage, InvalidPage):

        contacts = paginator.page(paginator.num_pages)

 

模板中的相关代码:

<div class="pagination">

<span class="step-links">

{% if rets.has_previous %}

<a href="?searchtext={

{ search_value }}&page={
{ rets.previous_page_number }}">&lt;前页</a>

<a href="?searchtext={

{ search_value }}&page={
{ rets.previous_page_number }}"> {
{rets.previous_page_number}} </a>

{% endif %}

<span class="current">

{

{ rets.number }}

</span>

{% if rets.has_next %}

<a href="?searchtext={

{ search_value }}&page={
{ rets.next_page_number }}"> {
{rets.next_page_number}} </a>

<a href="?searchtext={

{ search_value }}&page={
{ rets.next_page_number }}">后页&gt;</a>

{% endif %}

<span class="count">

(共{

{rets.paginator.num_pages}}页)

</span>

</span>

</div>

 

转载地址:http://gzxci.baihongyu.com/

你可能感兴趣的文章
Yotta企业云盘助力科技行业创高峰
查看>>
Yotta企业云盘更好地为教育行业服务
查看>>
Yotta企业云盘怎么帮助到能源化工行业
查看>>
企业云盘如何助力商业新发展
查看>>
医疗行业运用企业云盘可以带来什么样的提升
查看>>
媒体广告业如何将内容资产进行高效地综合管理与利用
查看>>
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
iSecret&nbsp;1.1&nbsp;正在审核中
查看>>
IOS开发的开源库
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>