my paginate function for DJango

作者:半瓶墨水 链接:http://www.2maomao.com/blog/my-paginate-for-django/

感觉DJango的分页浏览不是很好用,需要先查出来再搞分页。
由于很常用,所以我自己写了个函数mypaginate(注意我的分页格式很固定,用”&page=2″这种方式)

在view中这样调用

PAGE_SIZE = 10 #每页十个
params = "&keywords=%s&code_lang=%s" % (keywords, lang) #页面链接时候的额外参数
offset, page_navi, page_ex = mypaginate(request, total, PAGE_SIZE, params)

然后由render传给模板,模板中这么写

{% if page_ex.prev %}
<a href="{{page_ex.first}}">第一页</a>
<a href="{{page_ex.prev}}">上一页</a>
{% else %}
第一页 上一页
{% endif %}
{% for p, l in page_navi %}
<a id="p_{{p}}" href="/code/all/{{l}}">{{p}}</a>
{% endfor %}
{% if page_ex.max_page %}
...
<a href="{{page_ex.last}}">{{page_ex.max_page}}</a>
{% endif %}
{% if page_ex.next %}
<a href="{{page_ex.next}}">下一页</a>
<a href="{{page_ex.last}}">最后页</a>
{% else %}
下一页 最后页
{% endif %}

mypaginate函数源码

Python语言: 自己写的paginate函数 for Django
#发芽网的上下翻页那一块都是用的这个
#blog: http://www.2maomao.com/blog/my-paginate-for-django/

def mypaginate(request, total, pagesize, params=""):
    #get page info
    curr = int(request.GET.get('page', 1))
    #calculate the offset
    offset = (curr - 1) * pagesize
    if offset >= total:
        offset = total - 1
    if offset < 0:
        offset = 0
    #paginatize
    page_navi = []
    page_ex = {}
    max_page = (total - 1) / pagesize + 1
    start = curr - ((curr - 1) % 10)
    end = start + 10
    if end > max_page + 1:
        end = max_page + 1 #remember it's [start, end)
    elif max_page > end:
        page_ex['max_page'] = max_page

    for i in range(start, end):
        link = ("?page=%d&" % i) + params
        page_navi.append((i, link))
    if curr > 1:
        page_ex['first'] = ("?page=%d&" % 1) + params
        page_ex['prev'] = ("?page=%d&" % (curr - 1)) + params
    if curr < max_page:
        page_ex['next'] = ("?page=%d&" % (curr + 1)) + params
        page_ex['last'] = ("?page=%d&" % max_page) + params
  • Share/Bookmark

共 2 条评论

  • deng 五月 23rd, 2008 8:13 上午

Django的paginate不是查出来再分页的。。。

@deng
又看了一下,你说的没错
但是paginate功能过于简单加上他跟其他的功能绑定太紧,难以自定义啊。 :k

发表评论

  • :l
  • :)
  • :q
  • :(
  • :^
  • :x
  • :v
  • :D
  • :s
  • :h
  • :e
  • :X
  • :k
  • :w
  • :d
  • :p

注意:评论中需包含至少一个中文字,否则视为无效

Additional comments powered by BackType