Вопрос

В настоящее время я разрабатываю приложение 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 }}.Таким образом, в основном каждая ссылка на страницу будет ссылаться на первый вопрос на этой странице.

Это было полезно?

Решение

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

будут все объекты, независимо от страницы.Каждый из этих элементов будет иметь переменную "страница", которая сообщит вам, на какой странице они находятся.

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

Другие советы

Джанго, по крайней мере начиная с версии 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)

django-разбивка на страницы должен делать то, что вы хотите, и поставляется в красивой упаковке, которую вы можете просто подключить и использовать.По сути, это перемещает код из ваших представлений в шаблоны и промежуточное программное обеспечение.

Редактировать:Я только что видел вашу правку.Вы можете получить текущие объекты на странице, используя {% 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top