Django分页和"当前页面"

Den*_*gan 13 django django-templates django-views

我目前正在开发一个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 })
Run Code Online (Sandbox Code Playgroud)

在视图中,在这里我列出了不同的页面为"... 2,3,4,5,6,......"我想以某种方式突出显示当前页面,像很多做网页.

我真的想知道两件事:

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

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

uzi*_*uzi 10

嗯......我从你的评论中看到你不想做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 })
Run Code Online (Sandbox Code Playgroud)

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

{% for i in page.paginator.page_range %}
    {% ifequal i page.number %}
        <!-- Do something special for this page -->
    {% else %}
        <!-- All the other pages -->
    {% endifequal %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

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

page.object_list
Run Code Online (Sandbox Code Playgroud)

将是当前页面中的对象和

page.paginator.object_list
Run Code Online (Sandbox Code Playgroud)

将是所有对象,无论页面如何.每个项目都有一个"页面"变量,可以告诉您他们所在的页面.

所有人都说,你所做的事情听起来非常规.你可能想重新思考,但不管怎样,祝你好运.


Iva*_*mov 10

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 %}
Run Code Online (Sandbox Code Playgroud)

article_list是的实例

paginator = Paginator(article_list, 20)
    try:
        article_list = paginator.page(int(page))
    except (EmptyPage, InvalidPage):
        article_list = paginator.page(paginator.num_pages)
Run Code Online (Sandbox Code Playgroud)


Nic*_*sta 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 })
Run Code Online (Sandbox Code Playgroud)

在您的模板中,您可以通过执行以下操作访问当前页面:

# 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
Run Code Online (Sandbox Code Playgroud)

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