2009-11-27 91 views
0

我将这段代码用于分页,我希望用户的选择在整个站点中保持不变(迄今为止已解决)......现在唯一的问题是会话变量现在是永久的,直到通过关闭浏览器清除会话。另外,我怎样才能得到显示的相邻页面......就像在digg风格的Django分页器中一样。我一直无法理解如何将其实现到我的代码中。分页问题

的代码如下:

from django.core.paginator import Paginator, InvalidPage, EmptyPage 

def paginate(request, object_list, paginate_by=10): 
    try: 
     if "per_page" in request.session: 
     per_page = request.session["per_page"] 
     else: 
     request.session["per_page"] = int(request.REQUEST['p']) 
     per_page = request.session["per_page"] 
     request.session.set_expiry(0) 
    except: 
     per_page = 10 

    paginator = Paginator(object_list, per_page) 

    try: 
     page = int(request.GET.get('page', '1')) 
    except ValueError: 
     page = 1 

    try: 
     items = paginator.page(page) 
    except (EmptyPage, InvalidPage): 
     items = paginator.page(paginator.num_pages) 

    return items 

然后在我的模板,我有这样的呈现分页链接:

<div class="pagination" align="center"> 
<span class="step-links"> 
    {% if items.has_previous %} 
    <a href="?page={{ items.previous_page_number }}">previous</a> 
    {% endif %} 
    <span class="current"> 
    Page {{ items.number }} of {{ items.paginator.num_pages }} 
    </span> 
    {% if items.has_next %} 
    <a href="?page={{ items.next_page_number }}">next</a> 
    {% endif %} 
</span> 
</div> 

回答

0

您可以通过启用会话实现这一目标。

我推荐阅读djangobook网站上的章节Sessions, Users, and Registration


编辑:现在您已启用会话,我认为问题是模板中的超链接。使用的符号,以多个参数中的URL分开,例如

<a href="?p={{ request.session.per_page }}&page={{ items.next_page_number }}">next</a> 

编辑2:我不知道,如果我知道这个问题是与会话过期的东西。设置会话在浏览器关闭时过期的行是request.session.set_expiry(0)。如果你想改变它,请参阅Using Sessions in views上的django文档。

要创建一个Digg风格的分页器,您需要编写一个函数,该函数采用当前页码和总页数,并返回页码列表。然后,在模板中循环浏览页码并构建页面链接。

页号码清单将使你的页面数分成组的列表,如

[[1,2], [20,21,22,23,24], [30,31]]

+0

也这么认为......只是想知道,如果没有任何其他手段 – Stephen 2009-11-27 09:13:40

+0

我已经尝试了上面的代码,但是我必须得到错误的东西......现在分页不起作用(除了第一页)...我错过了或遗漏了什么 – Stephen 2009-11-27 13:00:26

+0

我看不到你的代码现在。如果您将问题标记为未回答(点击绿色勾号),并编辑您的问题以解释您尝试执行的操作,则可能会得到其他人的更多关注。 – Alasdair 2009-11-27 16:27:18