Django нумерация страниц и «текущая страница» - PullRequest
11 голосов
/ 14 апреля 2009

В настоящее время я разрабатываю приложение Django, которое будет использовать печально известную технику «нумерации страниц». Я пытаюсь выяснить, как работает модуль django.core.paginator.

У меня есть приложение с моделью Вопросов. Я буду перечислять все вопросы, используя этот 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. Как мне заставить Джанго выяснить, на какой странице находится вопрос?
  2. Как мне написать свой шаблон, чтобы правильно "выделить" текущую страницу?

РЕДАКТИРОВАТЬ: Извините, я забыл часть этого вопроса. Я также хотел бы, чтобы любая страница, кроме текущей, была ссылкой на /questions/{{ that_page.start_index }}. Таким образом, каждая ссылка на страницу ссылается на первый вопрос на этой странице.

Ответы [ 3 ]

10 голосов
/ 08 ноября 2010

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)
9 голосов
/ 15 апреля 2009

Хм ... Я вижу из вашего комментария, что вы не хотите использовать параметр 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", которая сообщит вам, на какой странице они находятся.

Все это говорит о том, что вы делаете, звучит нетрадиционно. Вы можете переосмыслить, но в любом случае, удачи.

5 голосов
/ 14 апреля 2009

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

С этим вы должны быть в состоянии сделать все, что вам нужно. Есть несколько хороших примеров здесь .

...