@Bulbashful

Корректировка пагинации в django?

Есть такой код
def articles(request):
    all_articles = Article.objects.all()
    try:
        page = request.GET.get('page')
    except:
        page = 1
    paginator = Paginator(all_articles,1)
    try:
        articless = paginator.page(page)
    except PageNotAnInteger:
        articless = paginator.page(1)
    except EmptyPage:
        articless = paginator.page(paginator.num_pages)
    return render_to_response('articles.html',{'articless':articless})

И такой шаблон
<nav class="text-center">
<ul class="pagination">
   {% if articless.has_previous %}
    <li><a href="?page={{articless.previous_page_number}}">&laquo;</a></li>
    {% else %}
    <li class="disabled"><a href="">&laquo;</a></li>
    {% endif %}
    {% for page in articless.paginator.page_range %}
                    {% if page == articless.number %}
                        <li class="active"><a>{{ page }}</a></li>
                    {% else %}
                        <li><a href="?page={{ page }}">{{ page }}</a></li>
                    {% endif %}
                {% endfor %}
    {% if articless.has_next %}
    <li><a href="?page={{articless.next_page_number }}">&raquo;</a></li>
    {% else %}
    <li class="disabled"><a href="">&raquo;</a></li>
    {% endif %}
</ul>
   </nav>

Как мне реализовать разбивку страниц плана " 1.. 5 6 7 ..10"? Стандартным путём получается так f67ababc06f9408697e671e811ea3248.png
  • Вопрос задан
  • 1082 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Django
Седой и строгий
Для примера кусок из моего старого кода:
<div class="page-nav">
    {% if paginator.page.has_previous %}
    <!-- Показывам кнопку со ссылкой, если есть предыдущая страница -->
    <a href="{% url 'newslines:show_page' paginator.page.previous_page_number %}">&lt;&nbsp; Вперед</a>
    {% else %}
    <!-- Показываем неактивную кнопку, если предыдущей страницы нет -->
    <span>&lt;&nbsp; Вперед</span>
    {% endif %}
    
    <!-- Прибавляем к номеру текущей страницы -4 (т.е. отнимаем 4) -->
    {% if paginator.page.number|add:'-4' > 0 %} 
    <!-- Если до текущей страницы есть больше 4 страниц, показываем многоточие -->
    <span class="ellipsis">...</span>
    {% endif %}
    
    {% if paginator.page.number|add:'-3' > 0 %}
    <!-- Если до текущей страницы есть ещё три страницы -->
    <a href="{% url 'newslines:show_page' paginator.page.number|add:'-3' %}">{{ paginator.page.number|add:'-3' }}</a>
    {% endif %}
    {% if paginator.page.number|add:'-2' > 0 %}
    <!-- Если до текущей страницы есть ещё две страницы -->
    <a href="{% url 'newslines:show_page' paginator.page.number|add:'-2' %}">{{ paginator.page.number|add:'-2' }}</a>
    {% endif %}
    {% if paginator.page.number|add:'-1' > 0 %}
    <!-- Если до текущей страницы есть ещё одна страница -->
    <a href="{% url 'newslines:show_page' paginator.page.number|add:'-1' %}">{{ paginator.page.number|add:'-1' }}</a>
    {% endif %}
    
    <!-- Номер текущей страницы -->
    <span>{{ paginator.page.number }}</span>
    
    {% if paginator.page.number|add:'1' <= paginator.num_pages %}
    <!-- Если после текущей страницы есть ещё одна страница -->
    <a href="{% url 'newslines:show_page' paginator.page.number|add:'1' %}">{{ paginator.page.number|add:'1' }}</a>
    {% endif %}
    {% if paginator.page.number|add:'2' <= paginator.num_pages %}
    <!-- Если после текущей страницы есть ещё две страницы -->
    <a href="{% url 'newslines:show_page' paginator.page.number|add:'2' %}">{{ paginator.page.number|add:'2' }}</a>
    {% endif %}
    {% if paginator.page.number|add:'3' <= paginator.num_pages %}
    <!-- Если после текущей страницы есть ещё три страницы -->
    <a href="{% url 'newslines:show_page' paginator.page.number|add:'3' %}">{{ paginator.page.number|add:'3' }}</a>
    {% endif %}
    
    {% if paginator.page.number|add:'4' <= paginator.num_pages %}
    <!-- Если после текущей страницы есть ещё четыре страницы -->
    <span class="ellipsis">...</span>
    {% endif %}    
    
    {% if paginator.page.has_next %}
    <!-- Показывам кнопку со ссылкой, если есть следующая страница -->
    <a href="{% url 'newslines:show_page' paginator.page.next_page_number %}">Назад &nbsp;&gt;</a>
    {% else %}
    <!-- Если нет следующей страницы -->
    <span>Назад &nbsp;&gt;</span>
    {% endif %}
</div>


Получается вот такая пагинация ef086be9918f47099a2dc17857a32883.png
Добавить элементы для первой и последней страницы не так тяжело, если надо.

Либо можно воспользоваться этим рецептом.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы