Вопрос по – Джанго: по-разному нумерация страниц на первой странице

3

В настоящее время я использую object_list Джанго для обработки нумерации страниц. Я рад перейти на соответствующий класс Paginator (), если вы считаете, что он мне нужен после того, как вы услышите мою проблему:

На главной странице я хочу разбить на страницы7, но наall other pages Я хочу разбить на страницы10.

Как бы я поступил так? Я действительно не могу понять это. Самое близкое, что я получил к тому, чтобы заставить его работать, привело к тому, что была исключена целая страница результатов, так что, очевидно, я этого не хочу.

Я буду чрезвычайно признателен за любые ответы. Дайте мне знать, если вам нужна дополнительная информация. Большое спасибо.

Джо

Ваш Ответ

4   ответа
0

Для моего конкретного сценария я искал разбиение на объекты внутри одного визуализированного шаблона (создание многостраничного документа). В моем случае, я думаю, что самый простой подход - забыть о paginator и использовать вместо него генератор.

    def pages_iter():
        page_num = 1
        num_records = lambda x: 30 if x > 1 else 10
        end_idx = 0

        while True:
            start_idx = end_idx
            end_idx += num_records(page_num)
            yield {
                'number': page_num,
                'object_list': donors[start_idx:end_idx]
            }

            if end_idx > donors.count() - 2:
                break
            page_num += 1

добавлять{ pages: page_iter } к контексту вашей страницы, и тогда у вас есть переменная paginator. Обратите внимание, чтоnum_records это функция, которая принимает page_number, так что вы действительно обладаете максимальной гибкостью.

В вашем шаблоне вы можете относиться к этому так же, как к paginator:

{% for page in pages %}
  {% if page.number == 1 %}
    {{ header }}
  {% endif %}

  {% for obj in page.object_list %}
    {{ obj }}
  {% endfor %}
{% endfor %}
6

Простоfrom django.core.paginator import Paginator и сделать объект пагинатора какp = Paginator(thestuff, 7) в представлении для домашней страницы,p = Paginator(thestuff, 10) где-либо еще. Тогда в любом случае связывайp в контексте, который вы используете для визуализации шаблона.p.object_list будет установлен соответствующим образом в любом случае (и вы, похоже, скажете, что «подход, который вы используете», верно? Т.е., это то, что вы подразумеваете под «Django» s object_list »).

Джангодокументы иметь отличные детали и примеры (при условии, что вы на версии 1.0 или выше). Если вы не можете заставить его работать, можете ли вы показать нам (упрощенную версию, которая все еще не работает) вашего шаблона и просмотреть код?

Изменить: теперь проблема была четко показана, и я думаю, что должна быть решена путем подкласса основной страницы Django, следующим образом:

from django.core.paginator import Paginator, Page

class MyPaginator(Paginator):

  def __init__(self, **kw):
    self.deltafirst = kw.pop('deltafirst', 0)
    Paginator.__init__(self, **kw)

  def page(self, number):
    "Returns a Page object for the given 1-based page number."
    number = self.validate_number(number)
    if number == 1:
      bottom = 0
      top = self.per_page - self.deltafirst
    else:
      bottom = (number - 1) * self.per_page - self.deltafirst
      top = bottom + self.per_page
    if top + self.orphans >= self.count:
      top = self.count
    return Page(self.object_list[bottom:top], number, self)

Теперь используйте MyPaginator точно так же, как приведенный выше текст и примеры показывают использование Django, за исключением того, что при его создании используйте дополнительный именованный аргументdeltafirst=3 сделать первую страницу на 3 короче, чем обычная длина страницы (из 10). Таким образом, вы будете использовать один пагинатор с номинальной длиной 10, но с точностью до 3, чтобы сделать первую страницу 3 короче, чем все остальные.

(Там могут быть проблемы вvalidate_number но я не уверен, что они появятся - если они появятся, MyPaginator также потребуется переопределить этот метод).

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededpastie.org/527183Error: User Rate Limit Exceeded user116170
Error: User Rate Limit Exceeded user116170
0

Я понимаю, что это старый вопрос, но в случае, если кто-то, как я, придет сюда и обнаружит, что мой unittest обнаружил проблему.

Алекс, по сути, прав, но не забудьте также реализовать_get_num_pages сself.orphans + self.deltafirst в противном случае последняя страница не будет правильной.

def _get_num_pages(self):
    """Returns the total number of pages."""
    if self._num_pages is None:
        if self.count == 0 and not self.allow_empty_first_page:
            self._num_pages = 0
        else:
            hits = max(1, self.count - self.orphans + self.deltafirst)
            self._num_pages = int(ceil(hits / float(self.per_page)))
    return self._num_pages
num_pages = property(_get_num_pages)

И юнит-тест:

def test_ads_paginator(self):
    per_page = 10
    num_items = 100
    num_firstpage = 5
    expected_num_pages = 11

    items = range(num_items)
    paginator = AdsPaginator(items, per_page, deltafirst=per_page-num_firstpage)
    last_item = paginator.page(paginator.num_pages).object_list[-1]

    self.assertEqual(len(paginator.page(1)), num_firstpage)
    self.assertEqual(paginator.num_pages, expected_num_pages)
    self.assertEqual(last_item, items[-1])
1

Функция object_list () использует Paginator для разбиения списка. Так что, если вы измените «размер» из кусков (7 против 8) ... тогда он делает то, что вы видите.

Choices: Этот последний выбор шаткий. Не делайте этого :-) Либо "взломайте это" или перейдите к Paginator.

Hack it ... по запросу & gt; страница 1, добавьте что-то еще в row_list. Я полагаю, вы могли бы заставить его в списке черезlist(row_list)и добавьте None или что-то черезrow_list.insert(0, None)

Paginate ... использовать Paginator

View + template ... чтобы ваш взгляд просто передавал список-наборов строк-запросов в шаблон. Попросите шаблон проверить страницу 1. Есть ли у вас петля / отображение подмножества row_list там? Глупо иметь такую логику в своем шаблоне. Это делает для сложного шаблона.

Error: User Rate Limit Exceeded user116170

Похожие вопросы