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页页码的方式;下拉框选择页码;或输入数字跳转页码等。这些我想等有需要的时候再去试验了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值