我目前正在开发一个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,......”我想以某种方式突出显示当前页面,就像许多页面一样页面确实。
我真的想知道两件事:
/questions/{{ that_page.start_index }}
的链接。所以基本上每个页面链接都会链接到该页面上的第一个问题。
答案 0 :(得分:10)
Django,来自版本1.2的at least,允许我们使用纯默认分页模板标记来完成此任务。
{% 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)
答案 1 :(得分:9)
嗯......我从你的评论中看到你不想做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
将是所有对象,无论页面如何。每个项目都有一个“页面”变量,可以告诉你他们在哪个页面。
所有人都说,你所做的事听起来非常规。你可能想重新思考,但无论如何,祝你好运。
答案 2 :(得分: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
在您的模板中,您可以通过以下方式访问当前页面:
{{1}}
有了这个,你应该能够做你需要的一切。 有几个很好的例子here。