Django 中如何针对自定义的 View 做分页显示

参考:http://www.obeattie.com/blog/posts/custom-view-pagination-django/
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))

参考以上代码,为了配合这个 view, 我写了个简单的 template 显示分页链接:

                {% if is_paginated %}
                    {% ifequal current_page 1 %}|
< 
                    {% else %} 
<href="?page=1">|&lt;</a>
                    {% endifequal %}
                    {% if has_previous %} 
<href="?page={{ previous_page }}">&lt;&lt;</a>
                    {% else %} 
&lt;&lt;
                    {% endif %}
                    {% for p in page_numbers %}
                        
<href="?page={{ p }}">{{ p }}</a>
                    {% endfor %}
                    {% if has_next %}
<href="?page={{ next_page }}">&gt;&gt;</a>
                    {% else %}
&gt;&gt;
                    {% endif %}
                    {% ifequal current_page pages %}
&gt;|
                    {% else %} 
<href="?page={{ pages }}">&gt;|</a>
                    {% endifequal %}
                    
&nbsp;&nbsp;
                    当前页:{{ current_page }}/{{ pages }}
                    
&nbsp;&nbsp;
                {% endif %}              
                共{{ hits }}个话题

另外,为了在模板中输出所有页码的链接,我给 render_to_response 的 context 字典变量增加了一个值:

'page_numbers': range(paginator.pages+1)[1:],

这样,一个功能齐全的分页代码就完成了。当然还可以在这个基础上修改一下,加入其他高级的分页功能。比如像 google 那样每次只显示10页页码的方式;下拉框选择页码;或输入数字跳转页码等。这些我想等有需要的时候再去试验了。

posted on 2007-03-06 13:13  NeilChen  阅读(2023)  评论(0编辑  收藏  举报

导航