preface
當頁面出現的條目多的時候,我們就需要使用分頁功能了。Django作為一個知名的web框架,自然也提供了分頁功能,下面說說它。
Python-shell 練練手
在python下入手
先創建一個操作對象
>>> hehe = ['ljf','richer','wang',1,2,3]
>>> hehe
['ljf', 'richer', 'wang', 1, 2, 3]
表示每頁兩份,表示把hehe這個列表每一頁2份數據
>>> p = Paginator(hehe,2) #表示每頁兩份,表示把hehe這個列表每一頁2份數據
>>> p
<django.core.paginator.Paginator object at 0x0000000000B75630>
統計多少個值
>>> p.count #統計多少個值
6
統計多少頁
>>> p.num_pages #統計多少頁
3
查看頁數
>>> p.page_range #查看頁數
range(1, 4)
取第一頁的內容
>>> p1=p.page(1) #取第一頁的內容
>>> p1
>>> p1.object_list
['ljf', 'richer']
獲取第二頁
>>> p2=p.page(2)
>>> p2
<Page 2 of 3>
顯示當前頁內容
>>> p2.object_list
['wang', 1]
判斷是否有一下頁
>>> p2.has_next() #判斷是否有一下頁
True
判斷是否有上一頁
>>> p1.has_previous() # 判斷是否有上一頁
False
判斷是否還有其他頁
>>> p1.has_other_pages() # 判斷是否還有其他頁
True
在html中使用分頁功能
在html中,我們需要使用django 的templatetags功能來實現動態顯示當前頁的前后3頁,避免頁數過大導致頁碼太長。這個功能可以參考官網的例子(https://docs.djangoproject.com/en/1.10/howto/custom-template-tags/)。
我們首先查看項目目錄,自己寫的tag在app下面新建一個目錄templatetags,必須是這個名字:
[root@salt devops]# tree BatchM
BatchM
├── Batch
│ ├── templatetags
│ │ ├── custom_tag.py # 這個就是自己定義的tag.
│ │ ├── __init__.py
custom_tag.py的內容
from django import template
from django.utils.html import format_html
register = template.Library() # 注冊到tempate庫里面
@register.filter # filter只能對一個參數傳入有效,調用到時候這樣用 {{ xx.line | ljf_power}}
def ljf_lower(val): #這個僅僅是測試練習寫的代碼,可以忽略。
return val.lower()
@register.simple_tag() # simple_tag能夠對傳入多個參數有效
def guess_page(current_page,loop_num):
'''
:param current_page: 當前頁
:param loop_num: 頁數范圍
:return:
'''
offset = abs(current_page - loop_num)
if offset < 3: # 表示取當前頁的前后三頁
if current_page == loop_num :
page_element = '''
<li class="active"><a href="?page=%s">%s<span class="sr-only">(current)</span></a></li>
'''%(loop_num,loop_num) # 拼html代碼
else:
page_element = '''
<li><a href="?page=%s">%s<span class="sr-only">(current)</span></a></li>
'''%(loop_num,loop_num)
return format_html(page_element)
else:
return '' # 必須寫一個return 空字符串,這樣就不會在前端頁面顯示None
我們再看看調用這個tags的html代碼
提前引入bootstrap,jquery。
{% load custom_tag %} # 需要引用剛才創建的tag
''''省略其他代碼N行
<nav>
<ul class="pagination">
{% if contacts.has_previous %} <!-- 判斷是否有首頁 -->
<li class="disabled"><a href="#">«</a></li>
{% endif %}
{% for page_num in contacts.paginator.page_range %}
{% guess_page contacts.number page_num %} <!-- guess_page 直接寫剛才在tag里面定義的方法, contacts.numer表示時當前頁,page_num表示for循環到元素-->
{% endfor %}
{% if contacts.has_next %} <!-- 判斷是否有下一頁 -->
<li class="disabled"><a href="#">»</a></li>
{% endif %}
</ul>
</nav>
再看views里面的代碼:
def apply_update_search(request):
'''
:param request:
:return:
'''
if request.method == 'GET':
records = models.WorkOrderOfUpdate.objects.filter(username=request.user.get_username()).order_by('OrderId').reverse() #數據庫搜索
page = request.GET.get('page') # 與前端頁面的a標簽鏈接保持一致
try:
contacts = pageinator.page(page)
except PageNotAnInteger: # 如果輸入到不是一個數字,發送第一頁
contacts = pageinator.page(1)
except EmptyPage: # 如果獲取到超過來頁數范圍,那么就返回最后一頁。
contacts = pageinator.page(pageinator.num_pages)
return render(request,'apply_update.html',{'btitle':'搜索操作記錄','contacts':contacts})
url配置
url(r"apply_update.html/search",views.apply_update_search,name='post_order_id')
以上功能完成后,就可以實現這樣的功能:
