16

我目前正在开发一个 Django 应用程序,它将利用臭名昭著的“分页”技术。我试图弄清楚 django.core.paginator 模块是如何工作的。

我有一个带有问题模型的应用程序。我将使用这个分页器列出所有问题。每页将有 20 个问题。

def show_question(question_pk):
    questions = Question.objects.all()
    paginator = Paginator(questions, 20)
    page      = ... # Somehow figure out which page the question is on
    return render_to_response('show_question.html', { 'page' : page })

在视图中,我将不同的页面列为“... 2, 3, 4 , 5, 6, ...” 我想以某种方式突出显示当前页面,就像许多页面一样。

我真的想知道两件事:

  1. 如何让 Django 找出问题所在的页面?
  2. 我将如何编写模板以正确“突出显示”当前访问的页面?

编辑:对不起,我忘记了这个问题的一部分。我还希望除当前页面之外的任何页面都可以链接到/questions/{{ that_page.start_index }}. 所以基本上每个页面链接都会链接到该页面上的第一个问题。

4

3 回答 3

12

嗯...我从您的评论中看到您不想执行 ol' GET 参数,这是 django.core.paginator 为使用而编写的。为了做你想做的事,我想不出比预先计算每个问题所在的页面更好的方法了。例如,您的视图最终将类似于:

ITEMS_PER_PAGE = 20
def show_question(question_pk):
    questions = Question.objects.all()
    for index, question in enumerate(questions):
        question.page = ((index - 1) / ITEMS_PER_PAGE) + 1
    paginator = Paginator(questions, ITEMS_PER_PAGE)
    page = paginator.page(questions.get(pk=question_pk).page)
    return render_to_response('show_question.html', { 'page' : page })

要突出显示模板中的当前页面,您需要执行类似的操作

{% for i in page.paginator.page_range %}
    {% ifequal i page.number %}
        <!-- Do something special for this page -->
    {% else %}
        <!-- All the other pages -->
    {% endifequal %}
{% endfor %}

至于这些项目,您将有两个不同的 object_lists 可以使用...

page.object_list

将是当前页面中的对象和

page.paginator.object_list

将是所有对象,无论页面如何。这些项目中的每一个都有一个“页面”变量,它将告诉您它们在哪个页面上。

话虽如此,你在做的事情听起来很不合常规。您可能需要重新考虑,但无论如何,祝您好运。

于 2009-04-15T00:24:23.230 回答
11

Django,至少从 1.2 版本开始,允许我们通过使用纯默认分页模板标签来完成这项任务。

{% for page in article_list.paginator.page_range %}
  {% if page == article_list.number %}
    {{ page }}
  {% else %}
    <a href="/page{{ page }}">{{ page }}</a>
  {% endif %}
{% endfor %}

其中 article_list 是

paginator = Paginator(article_list, 20)
    try:
        article_list = paginator.page(int(page))
    except (EmptyPage, InvalidPage):
        article_list = paginator.page(paginator.num_pages)
于 2010-11-08T16:19:46.683 回答
5

django-pagination应该做你想做的,并包装在一个漂亮的包中,你可以插入和使用。它本质上将代码从您的视图移动到模板和中间件。

编辑:我刚看到你的编辑。您可以使用 获取页面上的当前对象{% autopaginate object_list %},它将替换object_list为任何给定页面的当前对象。您可以遍历它,如果您想要第一个,您应该能够将它视为一个列表并执行object_list[0].

如果您想将此保留在您的视图中,您可以执行以下操作:

def show_question(question_pk):
    questions = Question.objects.all()
    paginator = Paginator(questions, 20)
    return render_to_response('show_question.html', { 'page' : paginator })

在您的模板中,您可以通过以下方式访问您所在的当前页面:

# Gives you the starting index for that page.
# For example, 5 objects, and you're on the second page. 
# start_index will be 3.
page.start_index

# You can access the current page number with:
# 1-based index
page.number

有了这个,你应该能够做你需要的一切。这里有几个很好的例子。

于 2009-04-14T14:06:35.757 回答