Как сделать «компактную» пагинацию в django?

Всем привет.

Столкнулся с ситуацией, что у меня образовалось порядка 600 материалов, и если разбивать их по 25 на страницу, то получаем 24 страницы. И пагинация, которая представлена на официальном сайте django, дает нам все 24 страницы на сайте.

Не подскажите, как можно сделать это все дело компактно, чтобы допустим выводило первые три и последнюю страницу. И этот пузырик перемещался за страничками?

Пока в темплейте я использую вот такую штуку:

<div class="row">
                        <div class="small-12 medium-12 large-12 column pagination_forum_block">
                            <ul class="pagination">
                                {% if forumpage.has_previous %}
                                    <li class="arrow"><a href="?page={{ forumpage.previous_page_number }}"><i class="fa fa-angle-double-left" aria-hidden="true"></i></a></li>
                                {% else %}
            {#                        <li class="arrow unavailable"><a href="">&laquo;</a></li>#}
                                {% endif %}

                                {% for page in forumpage.paginator.page_range %}
                                    {% if page == forumpage.number %}
                                        <li class="current"><a href="?page={{ page }}">{{ page }}</a></li>
                                    {% else %}
                                        <li><a href="?page={{ page }}">{{ page }}</a></li>
                                    {% endif %}
                                {% endfor %}

                                {% if forumpage.has_next %}
                                    <li class="arrow"><a href="?page={{ forumpage.next_page_number }}"><i class="fa fa-angle-double-right" aria-hidden="true"></i></a></li>
                                {% else %}
            {#                        <li class="arrow unavailable"><a href="">&raquo;</a></li>#}
                                {% endif %}
                            </ul>
                        </div>
                    </div>


И получается вот так:

39bd50a2e5804ae29d24bf76e0bcb8f8.png

А хочется что-то более умное и компактное, так как верстка адаптивная и на малых экранах получается 3-4 ряда циферок.

----

После изучения множества вариантов (регистрация тега, плагины, кастомные решения). Сделал по рекомендации с этого поста: Корректировка пагинации в django? - просто, банально и эффективно. Все же проще и эффективней.
  • Вопрос задан
  • 1552 просмотра
Решения вопроса 3
aRegius
@aRegius
Python Enthusiast
Оставьте две секции:
if page.has_previous и if page.has_next

По сути:

if page.has_previous
page.number #активная ссылка
else
page.number

if page.has_next
page.paginator.num_pages #активная ссылка
else
page.paginator.num_pages

Будет что-то типа (в зависимости от оформления) "Previous...................Next"
Ответ написан
Комментировать
sim3x
@sim3x
Такое проще решить в верстке и/или в темплейте
https://stackoverflow.com/questions/25420470/limit...
esimakin.github.io/twbs-pagination

Сделай блок с линками на страницы и горизонтальный скролл
karaboz.ru/2007/11/19/paginator-3000-postranichnay...
https://github.com/Cosmologist/paginator3000

Или ограничь вывод линков со страницами
Для слайса +- 1 страница - использовать встроенное решение Page.has_previous + Page.previous_page_number https://docs.djangoproject.com/en/1.10/topics/pagi...

Если нужен слайс страниц больше чем +- 1 придется покопаться в следующих линках
Если их будет мало, то гуглим по django pagination digglike

https://www.djangosnippets.org/snippets/773/
stackoverflow.com/questions/30864011/display-only-...
stackoverflow.com/questions/1689365/show-page-item...
https://djangosnippets.org/snippets/1735/

stackoverflow.com/questions/5426525/django-paginat...

пс большая часть линков может быть устаревшей -- тестируй на здоровье :)
Ответ написан
winordie
@winordie
Лучшая документация -- исходники
from django import template

register = template.Library()


@register.assignment_tag(takes_context=True)
def page_range(context):
    c = 5
    if context['paginator'].num_pages < 2 * (c + 1):
        return list(range(1, context['paginator'].num_pages + 1))
    if context['page_obj'].number < c + 2:
        n = range(1, 12)
    elif context['page_obj'].number > context['paginator'].num_pages - (c + 1):
        n = range(context['paginator'].num_pages - 2 * c, context['paginator'].num_pages + 1)
    else:
        n = range(context['page_obj'].number - c, context['page_obj'].number + (c + 1))
    return list(n)

<ul class="pager">
    {% if page_obj.has_previous %}
        <li class="previous"><a href="?page={{ page_obj.previous_page_number }}">{% trans "previous" %}</a></li>
    {% endif %}
    <li class="current">
        <ul class="pagination">
            {% page_range as page_range %}
            {% for page in page_range %}
                {% if page == page_obj.number %}
                    <li class="active">
                        <a href="?page={{ page }}">
                            {{ page }} <span class="sr-only">(current)</span>
                        </a>
                    </li>
                {% else %}
                    <li><a href="?page={{ page }}">
                        {{ page }}</a></li>
                {% endif %}
            {% endfor %}
        </ul>
    </li>
    {% if page_obj.has_next %}
        <li class="next"><a href="?page={{ page_obj.next_page_number }}">{% trans "next" %}</a></li>
    {% endif %}
</ul>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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