使用 Paginator 實現分頁功能


views.py

from mysite.models import student
from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger

# Create your views here.
def getdata(request):
    limit = 5  # 每頁顯示的筆數
    students = student.objects.all()
    paginator = Paginator(students, limit)  

    page = request.GET.get('page')  # 獲取頁碼
    try:
        students = paginator.page(page)  # 獲取該頁的資料
    except PageNotAnInteger:  # 如果頁碼不是個整數
        students = paginator.page(1)  # 取第一頁的資料
    except EmptyPage:  # 如果頁碼過大,没有相對的資料
        students = paginator.page(paginator.num_pages)  # 取最後一頁的資料

    return render(request,'getdata.html', {'students': students})

getdata.html

{% for s in students.object_list %}
    <tr> 
        <th scope="row">{{s.id}}</th> 
        <td>{{s.cName}}</td>
        <td>{{s.cSex}}</td>
        <td>{{s.cBirthday}}</td>
        <td>{{s.cEmail}}</td>
        <td>{{s.cPhone}}</td>
        <td>{{s.cAddr}}</td>
    </tr> 
{% endfor %}

<p>
    {# students.paginator.page_range 這個函式返回包含一個所有頁碼數的 range 對象 #}
    {# 即 range(1, students.paginator.num_pages + 1) #}

    <ul class="pagination">
        {% if students.has_previous %} {#如果有上一頁就創建#}
            <li class="page-item"><a class="page-link" href="?page={{ students.previous_page_number }}">上一頁</a></li>
        {% endif %}

        {% for page_number in students.paginator.page_range %}

            {% ifequal page_number students.number %}
                <li class="page-item"><a class="page-link active" href="">{{ page_number }}</a></li>
            {% else %}
                <li class="page-item"><a class="page-link" href="?page={{ page_number }}">{{ page_number }}</a></li>
            {% endifequal %}

        {% endfor %}

        {% if students.has_next %} {#如果有下一頁就創建#}
            <li class="page-item"><a class="page-link" href="?page={{ students.next_page_number }}">下一頁</a></li>
        {% endif %}
    </ul>
</p> 

效果