代码之家  ›  专栏  ›  技术社区  ›  Deniz Dogan

Django分页和“当前页”

  •  9
  • Deniz Dogan  · 技术社区  · 15 年前

    我目前正在开发一个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, ,5,6,…“我想以某种方式突出显示当前页面,就像许多页面一样。

    我真的想知道两件事:

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

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

    3 回复  |  直到 7 年前
        1
  •  7
  •   uzi    15 年前

    隐马尔可夫模型。。。我从您的评论中看到,您不希望执行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 %}
    

    对于这些项目,您将有两个不同的对象列表用于…

    page.object_list
    

    将是当前页中的对象,并且

    page.paginator.object_list
    

    将是所有对象,而不考虑页面。每个项目都有一个“page”变量,告诉你它们在哪个页面上。

    这都是说,你所做的听起来很不传统。你可能想重新考虑一下,但无论如何,祝你好运。

        2
  •  10
  •   Ivan Kharlamov    14 年前

    詹戈 at least 从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 %}
    

    其中项目清单是的实例

    paginator = Paginator(article_list, 20)
        try:
            article_list = paginator.page(int(page))
        except (EmptyPage, InvalidPage):
            article_list = paginator.page(paginator.num_pages)
    
        3
  •  5
  •   Nick Presta    15 年前

    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
    

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