python的Web框架,html分頁
阿新 • • 發佈:2019-03-13
led 超出 text 數據量 digi imp context model true
使用簡單的算法得出頁碼數,然後在html中獲取即可。僅供參考。
views的寫法
1 def crm_stu(request): 2 section = ‘教師後臺管理頁‘ 3 search = request.GET.get(‘search‘, ‘‘).strip() 4 if search: 5 if search.isdigit(): 6 sts = Students.objects.filter(Q(qq=search) | Q(phone=search), is_deleted=False).order_by(‘-e_time‘) 7 else: 8 sts = Students.objects.filter(name__contains=search, is_deleted=False).order_by(‘-e_time‘) 9 10 else: 11 sts = Students.objects.filter(is_deleted=False).order_by(‘-e_time‘) 12 13 14 把需要的數據計算出來,然後傳給tags標簽 15 # 當前頁 16 page = request.GET.get(‘page‘, 1) 17 page = int(page) 18 # 每頁顯示的數據條數 19 per_page = request.GET.get(‘per_page‘, 10) 20 per_page = int(per_page) 21 # 總學生數 22 total_count = sts.count() 23 # 總頁數 24 total_page = math.ceil(total_count/per_page) 25 26 # 獲取數據的範圍。 27 sts = sts[(page-1)*per_page:page*per_page]28 return render(request, ‘teacher/crm-stu.html‘, context={ 29 ‘section‘: section, 30 ‘sts‘: sts, 31 ‘search‘: search, 32 ‘page‘: page, 33 ‘per_page‘: per_page, 34 ‘total_page‘:total_page, 35 })
標簽tags的方法定義
1 # 註冊並把配置的網頁放進來,並把context傳給網頁 2 @register.inclusion_tag(‘inclu_tags/pagination.html‘,takes_context=True) 3 4 def pagination(context): 5 6 # 除當前頁外,每兩邊的頁碼數 7 num = 2 8 page = context[‘page‘] 9 per_page = context[‘per_page‘] 10 total_page = context[‘total_page‘] 11 12 page_list = [] 13 # 生成左邊的頁碼以及當前頁碼 14 if page - num <= 0: #如果當前頁面減去num的數量小於等於0,則左邊頁碼是展示不全的,不夠num的數量 15 for i in range(page): 16 page_list.append(i+1) 17 else: 18 for i in range(page-num,page+1): 19 page_list.append(i) 20 21 # 生成右邊的頁碼 22 if page + num >= total_page: #如果當前的頁碼加上num的數量大於總頁數,則右邊的頁碼超出了總頁數,就需要頁碼只到總頁數為止 23 for i in range(page+1, total_page+1): 24 page_list.append(i) 25 else: 26 for i in range(page+1, page+num+1): 27 page_list.append(i) 28 29 return { 30 ‘page_list‘: page_list, 31 ‘context‘: context, 32 }
num代表頁面兩邊的頁面數量。每邊的頁碼只有2個,則num就是2。
html中的用法:css樣式請忽略
1 <nav aria-label="Page navigation"> 2 <ul class="pagination" style="margin: 0"> 3 4 <!--如果當前頁碼為1,則顯示css樣式,不能點擊--> 5 <li {% if context.page == 1 %}class="disabled" {% endif %}> 6 如果當前頁碼為大於1,則加上href標簽,可以有點擊上一頁的標簽,且上一頁的標簽需要渲染出來。是當前網址+參數(搜索內容,當前頁碼-1,每頁展示的數據條數) 7 <a {% if context.page > 1 %}href="{{ request.path }}?search={{ context.search }}&page={{ context.page|add:‘-1‘ }} 8 &per_page={{ context.per_page }}"{% endif %} aria-label="Next"> 9 <span aria-hidden="true">«</span> 10 </a> 11 12 13 </li> 14 {% for page in page_list %} 15 <li {% if context.page == page %}class="active" {% endif %}><a href="{{ request.path }}?search={{ context.search }} 16 &page={{ page }}&per_page={{ context.per_page }}">{{ page }}</a></li> 17 {% endfor %} 18 <li {% if context.page == context.total_page %}class="disabled" {% endif %}> 19 <a {% if context.page < context.total_page %}href="{{ request.path }}?search={{ context.search }}&page= 20 {{ context.page|add:‘1‘ }}&per_page={{ context.per_page }}"{% endif %} aria-label="Next"> 21 <span aria-hidden="true">»</span> 22 </a> 23 </li> 24 <li><a href="{{ request.path }}?page=1&per_page={{ context.per_page }}">回到首頁</a></li> 25 </ul> 26 </nav>
Django內置分頁功能
# 接受兩個參數 from django.core.paginator import Paginator from teacher.models import Students >>>p = Paginator(Students.objects.all().ordet_by(‘-c_time‘), 3) # 總數據量 >>> p.count 15 # 總頁數 >>> p.nun_pages 5 # 頁面範圍 >>> p.page_range range(1,6) # 返回第一頁的數據 >>> page1 = p.page(1) # 獲取的是一個可叠代的set字段 >>> page1.object_list <QuerySet [<Students: 哈哈哈-23>, <Students: 哈哈-15>, <Students: aaaasdds-16>]> # 是否有上一頁 >>> page1.has_previous() False # 是否有下一頁 >>> page.has_next() True # 下一頁的頁碼 >>> page1.next_page_number() 2 # 獲取當前頁的數據 >>> s = p.get_page(1) # 當前頁碼 >>>page1.nunber 1
python的Web框架,html分頁