Django ::: paginator显示所有对象页面,我该如何解决它

时间:2015-04-29 02:59:33

标签: django paginator

paginator显示:first prev 1 2 3 4 5 6 7 8 9 10 11 12 13 next last 我怎么能这样做«第一个<上一个... 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 个答案:

答案 0 :(得分:0)

使用当前页面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),以及< em>(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.您不会返回页面&lt; = 0 ,或&gt;最大。