Диапазон страниц Django paginator для отображения не всех чисел

У меня есть нумерация страниц на моем сайте, но она показывает мне каждую страницу, например 1-19, я хочу отображать только 5 страниц. введите здесь описание изображения

Как я могу это сделать?

просмотры.py

    paginator = Paginator(object_list, new_number_of_list)

    page = request.GET.get('page')

    try:
        Items = paginator.page(page)
    except PageNotAnInteger:
        Items = paginator.page(1)
    except EmptyPage:
        Items = paginator.page(paginator.num_pages)

    variables = RequestContext(request, {"Items": Items,
                                         "ForItemCount": ForItemCount,
                                         "page": page,
                                         })
    return render(request, 'templates/Core/resource_base.html',
                           variables)

моя страница.html

<div class="pagination p1">
  <span class="step-links">
    <ul>

          {% for l in  Items.paginator.page_range %}
            <li><a href="?page={{forloop.counter}}">{{forloop.counter}}</a></li>
          {% endfor %}



    </ul>
  </span>
</div>

person I.Jokhadze    schedule 13.12.2016    source источник


Ответы (3)


У вас уже есть {{ forloop.counter }}, вы можете использовать его, чтобы ограничить его пятью.

      {% for l in  Items.paginator.page_range %}
        {% if forloop.counter < 5 %}
            <li><a href="?page={{forloop.counter}}">{{forloop.counter}}</a></li>
        {% endif %}
      {% endfor %}

Вот еще одно решение, которое может дать вам еще несколько вариантов, если вам интересно: Проблема с отображением страниц в Django: отображаются все номера страниц.

И, наконец, вот очень хороший учебник по ускорению работы с нумерацией страниц, которую django предлагает из коробки: https://simpleisbetterthancomplex.com/tutorial/2016/08/03/how-to-разбиениенастраницысdjango.html.

person David542    schedule 13.12.2016

Еще одно быстрое решение, которое можно использовать (например, ограничение + и - 5):

{% for l in  Items.paginator.page_range %}
    {% if l <= Items.number|add:5 and l >= Items.number|add:-5 %}
        <li><a href="?page={{forloop.counter}}">{{forloop.counter}}</a></li>
    {% endif %}
{% endfor %}
person Andrysha    schedule 25.03.2018
comment
Эй, это потрясающе, просто и работает очень хорошо. Спасибо! - person Ivan; 01.07.2018
comment
Отлично ! - person Mahdi Ghelichi; 14.12.2018

Посмотрите, если https://medium.com/@sumitlni/paginate-properly-please-93e7ca776432 помогает. Код использует 10 для «соседей», но вы можете изменить его на 5 при использовании тега.

person LNI    schedule 24.01.2018
comment
Кстати, это хорошее решение, но ваш link_name работает неправильно. Эта версия работает корректно: @register.filter(name='link_name') def link_name(path, page_number): url = urlparse(path) qs = parse_qs(url[4]) page_number = str(page_number) qs['page'] = page_number return urlunparse((url[0], url[1], url[2], url[3], urlencode(qs), url[5])) - person el fuego; 11.02.2018
comment
Спасибо @elfuego, можете ли вы сказать мне, что пошло не так, что потребовало от вас добавления дополнительного кода, и какую версию Django вы использовали? Я развернул это на рабочем сайте и не столкнулся с какими-либо проблемами, но тестировал только 1.11. - person LNI; 13.02.2018
comment
Фактическая проблема заключается в том, что каждый раз, когда вы нажимаете на ссылку страницы, к ссылке добавляется дополнительный &page=X, поэтому в конечном итоге вы получаете ...?page=X&page=Y.... Моя версия Django — 2.0.1, моя версия Python — 3.6.2. - person el fuego; 14.02.2018
comment
Я имею в виду, если у вас есть как минимум 2 страницы, и если вы нажмете на страницу 2, она добавит ?page=2 к ссылке, а если вы затем нажмете на страницу 1, она добавит еще один &page=1 и станет ?page=2&page=1 , при этом он должен перезаписать предыдущую страницу. - person el fuego; 14.02.2018
comment
Спасибо @elfuego, это отличный улов! Исправлю в своем коде и переопубликую. - person LNI; 14.02.2018