参考:
http://www.obeattie.com/blog/posts/custom-view-pagination-django/
http://www.djangoproject.com/documentation/models/pagination/
在上述链接的资料中,核心的分页逻辑代码如下:
参考以上代码,为了配合这个 view, 我写了个简单的 template 显示分页链接:
另外,为了在模板中输出所有页码的链接,我给 render_to_response 的 context 字典变量增加了一个值:
这样,一个功能齐全的分页代码就完成了。当然还可以在这个基础上修改一下,加入其他高级的分页功能。比如像 google 那样每次只显示10页页码的方式;下拉框选择页码;或输入数字跳转页码等。这些我想等有需要的时候再去试验了。
http://www.djangoproject.com/documentation/models/pagination/
在上述链接的资料中,核心的分页逻辑代码如下:
#
demo Model
class Tag(models.Model):
name = models.CharField( ' Tag Name ' , maxlength = 200 )
slug = models.SlugField(prepopulate_from = ( ' name ' , ))
def __str__ (self):
return self.name
from django.core.paginator import ObjectPaginator, InvalidPage
# demo View
def tag_list(request):
tags = Tag.objects.order_by( ' name ' )
paginator = ObjectPaginator(tags, 5 )
try :
page = int(request.GET.get( ' page ' , ' 1 ' ))
tags = paginator.get_page(page - 1 )
except InvalidPage:
raise http.Http404
return shortcuts.render_to_response( " tag_list.html " , {
' paginator ' : paginator,
' tags ' : tags,
' is_paginated ' : paginator.pages > 1 ,
' has_next ' : paginator.has_next_page(page - 1 ),
' has_previous ' : paginator.has_previous_page(page - 1 ),
' current_page ' : page,
' next_page ' : page + 1 ,
' previous_page ' : page - 1 ,
' pages ' : paginator.pages,
' hits ' : paginator.hits,
},
context_instance = RequestContext(request))
class Tag(models.Model):
name = models.CharField( ' Tag Name ' , maxlength = 200 )
slug = models.SlugField(prepopulate_from = ( ' name ' , ))
def __str__ (self):
return self.name
from django.core.paginator import ObjectPaginator, InvalidPage
# demo View
def tag_list(request):
tags = Tag.objects.order_by( ' name ' )
paginator = ObjectPaginator(tags, 5 )
try :
page = int(request.GET.get( ' page ' , ' 1 ' ))
tags = paginator.get_page(page - 1 )
except InvalidPage:
raise http.Http404
return shortcuts.render_to_response( " tag_list.html " , {
' paginator ' : paginator,
' tags ' : tags,
' is_paginated ' : paginator.pages > 1 ,
' has_next ' : paginator.has_next_page(page - 1 ),
' has_previous ' : paginator.has_previous_page(page - 1 ),
' current_page ' : page,
' next_page ' : page + 1 ,
' previous_page ' : page - 1 ,
' pages ' : paginator.pages,
' hits ' : paginator.hits,
},
context_instance = RequestContext(request))
参考以上代码,为了配合这个 view, 我写了个简单的 template 显示分页链接:
{% if is_paginated %}
{% ifequal current_page 1 %}| <
{% else %} < a href ="?page=1" > | < </ a >
{% endifequal %}
{% if has_previous %} < a href ="?page={{ previous_page }}" > << </ a >
{% else %} <<
{% endif %}
{% for p in page_numbers %}
< a href ="?page={{ p }}" > {{ p }} </ a >
{% endfor %}
{% if has_next %} < a href ="?page={{ next_page }}" > >> </ a >
{% else %} >>
{% endif %}
{% ifequal current_page pages %} > |
{% else %} < a href ="?page={{ pages }}" > > | </ a >
{% endifequal %}
当前页:{{ current_page }}/{{ pages }}
{% endif %}
共{{ hits }}个话题
{% ifequal current_page 1 %}| <
{% else %} < a href ="?page=1" > | < </ a >
{% endifequal %}
{% if has_previous %} < a href ="?page={{ previous_page }}" > << </ a >
{% else %} <<
{% endif %}
{% for p in page_numbers %}
< a href ="?page={{ p }}" > {{ p }} </ a >
{% endfor %}
{% if has_next %} < a href ="?page={{ next_page }}" > >> </ a >
{% else %} >>
{% endif %}
{% ifequal current_page pages %} > |
{% else %} < a href ="?page={{ pages }}" > > | </ a >
{% endifequal %}
当前页:{{ current_page }}/{{ pages }}
{% endif %}
共{{ hits }}个话题
另外,为了在模板中输出所有页码的链接,我给 render_to_response 的 context 字典变量增加了一个值:
'
page_numbers
'
: range(paginator.pages
+
1
)[
1
:],
这样,一个功能齐全的分页代码就完成了。当然还可以在这个基础上修改一下,加入其他高级的分页功能。比如像 google 那样每次只显示10页页码的方式;下拉框选择页码;或输入数字跳转页码等。这些我想等有需要的时候再去试验了。