Django::: paginator показать все страницы объектов, как я могу это исправить
paginator показывает: первый предыдущий 1 2 3 4 5 6 7 8 9 10 11 12 13 следующий последний как я могу сделать это следующим образом "первый‹ предыдущий… 2 3 4 5 6 7 8 9 10… следующий ›последний"
я не хочу использовать пакет django-paginator, также я попробовал тег django paginator, но не успех.
Views.py
def hire(request):
hire_article_list = hire_article.objects.all().order_by('-id')[0:200]
paginator = Paginator(hire_article_list, 2) # Show 25 contacts per page
page = request.GET.get('page')
try:
hire_article_s = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
hire_article_s = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
hire_article_s = paginator.page(paginator.num_pages)
#return render_to_response('hire/list.html', {"page_list": page_list})
context = {'hire_article_s': hire_article_s}
return render(request, 'hire/list.html', context)
list.html
{% load static from staticfiles %}
{% for j in hire_article_s %}
{# Each "j" is a page_list model object. #}
<li><a href="/hire/{{ j.slug }}-{{j.id}}">{{ j.hiring|capfirst}}</a></li>
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if hire_article_s.has_previous %}
<a href="?page=1">first</a>
<a href="?page={{ hire_article_s.previous_page_number }}">prev</a>
{% endif %}
{% for page in hire_article_s.paginator.page_range %}
{% ifequal page page.number %}
<!-- Do something special for this page -->love
<span id="currentpage">page</span>
{% else %}
<!-- All the other pages -->
{% endifequal %}
{% if page == hire_article_s.number %}
{{ page }}
{% else %}
<a href="/hire/?page={{ page }}">{{ page }}</a>
{% endif %}
{% endfor %}
{% if hire_article_s.has_next %}
<a href="?page={{ hire_article_s.next_page_number }}">next</a>
<a href="?page={{ hire_article_s.paginator.num_pages}}">last</a>
{% endif %}
</span>
</div>
1 ответ
На текущей странице 6 вы хотите показать 2 3 4 5 [6] 7 8 9 10
,
На текущей странице 5 вы хотите показать 1 2 3 4 [5] 6 7 8 9
,
На текущей странице 10 вы хотите показать 6 7 8 9 [10] 11 12 13 14
,
Итак, каков закон? Закон должен показывать номер текущей страницы и 4 меньшие страницы + 4 большие страницы.
Учитывая текущее число n, вы захотите показать от (n - 4) до (n - 1) и (n + 1) до (n + 4)
Итак, вместо того, чтобы делать:
{% for page in hire_article_s.paginator.page_range %}
Ты можешь сделать:
{% for page in hire_article_s.paginator.page_range|page_filter:hire_article_s.number %}
в котором, page_filter
это фильтр, который вы должны определить, чтобы он получил page_range
список и current_page_number
и верните список, как указано выше.
Примечание. Будьте осторожны с угловым регистром, когда текущая страница находится вблизи границы. Например, если это 2, вы должны вернуть 1 [2] 3 4 5 6 вместо -2 -1 0 1 [2] 3 4 5 6. Вы не вернете страницу <= 0 или> максимум.