参考:http://www.obeattie.com/blog/posts/custom-view-pagination-django/http://www.djangoproject.com/documentation/models/pagination/在上述链接的资料中,核心的分页逻辑代码如下:
# demo Modelclass Tag(models.Model): name = models.CharField('Tag Name', maxlength=200) slug = models.SlugField(prepopulate_from=('name', )) def __str__(self): return self.namefrom django.core.paginator import ObjectPaginator, InvalidPage# demo Viewdef 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 显示分页链接:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> {% 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 }}个话题另外,为了在模板中输出所有页码的链接,我给 render_to_response 的 context 字典变量增加了一个值:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->'page_numbers': range(paginator.pages+1)[1:],这样,一个功能齐全的分页代码就完成了。当然还可以在这个基础上修改一下,加入其他高级的分页功能。比如像 google 那样每次只显示10页页码的方式;下拉框选择页码;或输入数字跳转页码等。这些我想等有需要的时候再去试验了。 |