如果您仍在寻找这个,这就是我使用的。
def make_pagination(paginator, items=4, show_arrows=True, edges=2):
"""
Returns a list by which a pagination can be prepared in template by simply
iterating over it
:param paginator: the django paginated queryset. (what you get after paginator.page(.....))
:param items: the number of items to show in center sub-list (place even numbers only)
:param show_arrows: show arrows at end and beginning.
:param edges: no of items to show at the edges including '...' (set edges=0 to hide )
:return: (sample output)
{'current_page': 6,
'total_pages': 155,
'pages': [{'text': u'\xab', 'class': 'first', 'val': 1}, {'text': 1, 'val': 1}, {'text': 2, 'val': 2}, {'text': '...', 'val': ''}, {'text': 4, 'val': 4}, {'text': 5, 'val': 5}, {'text': 6, 'class': 'act', 'val': 6}, {'text': 7, 'val': 7}, {'text': 8, 'val': 8}, {'text': '...', 'val': ''}, {'text': 154, 'val': 154}, {'text': 155, 'val': 155}, {'text': u'\xbb', 'class': 'last', 'val': 155}]
}
"""
find = paginator.number
span = items / 2
span = span if items % 2 == 0 else (span + 1)
page_range = paginator.paginator.page_range
indx = page_range.index(find) if find in page_range else 0
L = indx - span
R = indx + span + 1
_len = len(page_range)
if L < 0:
R += 0 - L
L = 0
if R - _len > 0:
L -= R - _len
R = _len
sel_range = page_range[L:R]
if edges:
Ls = page_range[:edges]
if Ls[-1] < sel_range[0]:
sel_range = Ls + ['...'] + sel_range
else:
sel_range = list(set(Ls + sel_range))
Rs = page_range[-edges:]
if sel_range[-1] < Rs[0]:
sel_range = sel_range + ['...'] + Rs
else:
sel_range = list(set(sel_range + Rs))
pages = []
for item in sel_range:
pg = {'text': item, 'val': item}
if item == '...':
pg['val'] = ''
if item == find:
pg['class'] = 'act'
pages.append(pg)
if show_arrows:
if page_range[0] == find:
pages.insert(0, {'text': u'«', 'class': 'first act', 'val': 1})
else:
pages.insert(0, {'text': u'«', 'class': 'first', 'val': 1})
if page_range[-1] == find:
pages.append({'text': u'»', 'class': 'last act', 'val': page_range[-1]})
else:
pages.append({'text': u'»', 'class': 'last', 'val': page_range[-1]})
return {'current_page': find, 'total_pages': paginator.paginator.num_pages, 'pages': pages}
将上下文中 make_pagination 的输出作为“分页”传递,然后
<p class="_nav">
{% for page in pagination.pages %}
<a class="{{ page.class }}" href="{{ page.val }}/">{{ page.text }}</a>
{% endfor %}
</p>