Django組件之分頁器
阿新 • • 發佈:2019-01-06
import dex 避免 ane ace top consola klist oss
如果數據太多單頁顯示過於繁雜,來使用分頁器來顯示
其他準備工作(如數據庫遷移)略
models.py
1: class Book(models.Model):
2: title = models.CharField(max_length=32)3: price = models.DecimalField(decimal_places=2, max_digits=8)
views.py
1: from app01.models import *
2: from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
3:4: def index(request):5: # 批量導入大量數據到book表6: Booklist = []7: for i in range(100):8: book = Book(title="book_%s" % i, price=i*i)
9: book_list.append(book)10: # 所有數據掛在Booklist中一次性導入11: Book.objects.bulk_create(book_list)12:13: # 分頁器的使用14: book_list=Book.objects.all()15: # 總分頁器對象,第二個參數是每頁顯示數量16: paginator = Paginator(book_list, 10)17: # 數據總數18: print("count:",paginator.count)19: # 總頁數20: print("num_pages:",paginator.num_pages)21: # 頁碼的列表22: print("page_range:",paginator.page_range)23: # 第1頁的page對象24: page1=paginator.page(1)25: # 遍歷第1頁的所有數據對象26: for i in page1:27: print(i)
28: print(page1.object_list) #第1頁的所有數據
29:30: # 當前的頁面,第二個參數是頁數默認值31: try:32: current_page_num = int(request.GET.get("page", 1))
33: current_page = paginator.page(current_page_num)34: for i in current_page:35: print(i)
36: except EmptyPage as e:37: current_page = paginator.page(1)38:39: return render(request, "index.html", locals())40:
index.html
1: <ul>2: {% for book in current_page %}3: <li>{{book.title}}:{{book.price}}</li>4: {% endfor %}5: </ul>
這樣簡單的分頁就實現了,下面通過bootstrap來玩底面的分頁樣式。
cdn鏈接
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
模板代碼
1: <nav aria-label="Page navigation">2: <ul class="pagination">3: {# 為了避免頁面溢出,需要用到頁面對象的四個api #}4: {% if current_page.has_previous %}5: {# 上一頁,點一下頁碼減一 #}6: <li><a href="?page={{ current_page_num.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">«</span></a></li>7: {% else %}8: <li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">«</span></a></li>9: {% endif %}10:11:12: {# 自動遍歷頁碼 #}13: {% for item in paginator.page_range %}14: {# 當前頁碼高亮 #}15: {% if current_page_num == item %}16: <li class="active"><a href="?page={{item}}">{{ item }}{{}}</a></li>17: {% else %}18: <li><a href="?page={{item}}">{{ item }}{{}}</a></li>19: {% endfor %}20:21: {% if current_page.has_next %}22: {# 上一頁,點一下頁碼加一 #}23: <li><a href="?page={{ current_page_num.next_page_number }}" aria-label="Previous"><span aria-hidden="true">«</span></a></li>24: {% else %}25: <li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">«</span></a></li>26: {% endif %}27: </ul>28: </nav>
擴展
當頁面特別多,不用顯示所有的頁碼.
views
1: # 指定顯示頁面的固定數量為10個2: if pagintor.num_pages > 11:
3:4: # 控制左邊顯示最低為15: if current_page_num - 5 < 1:
6: page_range = range(1, 11)7: # 控制右邊顯示最高為最大頁碼數8: elif current_page_num + 5 < paginator.num_pages:9: page_range = range(paginator.num_pages - 11 , paginator.num_pages + 1)10: # 正常顯示11: else:
12: page_range = range(current_page_num-5, current_page_num+6)13: else:
14: page_rane = paginator.page_range15: # html文件中對應的變量也應該更換
Django組件之分頁器