分頁是指在web頁面有大量數據需要顯示,為了閱讀方便在每頁中只顯示部分數據。優點是方便閱讀和減少數據量提取,減輕服務器壓力。
Django提供了Paginator類可方便的實現分頁功能。Paginator類位於’django.core.paginator’模塊中。
負責分頁數據整體的管理。
paginator = Paginator(object_list, per_page)
參數:
返回值:
Paginator的對象
參數number為頁碼信息(從1開始);
返回當前number也對應的頁信息;
如果提供的頁碼不存在,拋出Invalidpage異常,包含兩種異常子類:
負責某一頁數據的管理。
Paginator對象的page()方法返回page對象。
page = Paginator.page(頁碼)
例:
(a)views.py
def test_page(request):
# /test_page/4
# /test_page?page=1
page_num = request.GET.get('page', 1)
all_data = ['a', 'b', 'c', 'd', 'e']
# 初始化paginator
paginator = Paginator(all_data, 2)
# 初始化具體頁碼的page對象
c_page = paginator.page(int(page_num))
return render(request, 'test_page.html', locals())
(b)urls.py
urlpatterns = [
path('admin/', admin.site.urls),
# path('test_mw/', views.test_mw),
path('test_csrf', views.test_csrf),
path('test_page', views.test_page),
]
(c)template.test_page
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>分頁</title>
</head>
<body>
<!-- <a href="/make_page_csv?page={
{ c_page.number }}">生成</a> -->
{% for p in c_page %}
<p>{
{ p }}</p>
{% endfor %}
{% if c_page.has_previous %}
<a href="/test_page?page={
{ c_page.previous_page_number }}">上一頁</a>
{% else %}
上一頁
{% endif %}
{% for p_num in paginator.page_range %}
{% if p_num == c_page.number %}
{
{ p_num }}
{% else %}
<a href="/test_page?page={
{ p_num }}">{
{ p_num }}</a>
{% endif %}
{% endfor %}
{% if c_page.has_next %}
<a href="/test_page?page={
{ c_page.next_page_number }}">下一頁</a>
{% else %}
下一頁
{% endif %}
</body>
</html>
訪問:http://192.168.28.128:8000/test_page