Django自定義分頁 ---- 第13章

1. 自定義分頁效果

可以實現查找 首頁和最後一頁,上一頁和下一頁,以及指定頁
在這裏插入圖片描述

2. 自定義分頁的實現

模型Model部分的代碼:

models.py:

from django.db import models

class UserType(models.Model):
    """
    用戶類型表
    """
    title = models.CharField(max_length=32)

class UserInfo(models.Model):
    """
    用戶表
    """
    name = models.CharField(max_length=16)
    age = models.IntegerField()
    ut = models.ForeignKey('UserType', on_delete=models.CASCADE)

控制器Controller部分的代碼:

vews.py:

from django.shortcuts import render, HttpResponse
from app01 import models
from utils.pagger import PageInfo


class PageInfo:
    def __init__(self, current_page, per_page, count_sum, base_url, show_page=11):
        """
        :param current_page:當前的頁碼
        :param per_page:每頁顯示的數據量
        :param count_sum:總的數據量
        """
        try:
            self.current_page = int(current_page)
        except Exception as e:
            self.current_page = 1
        self.per_page = per_page
        self.count_sum = count_sum
        a, b = divmod(count_sum, per_page)
        if b:
            a += 1
        # page_num:所有頁碼的數量
        self.sum_page_num = a
        self.show_page = show_page
        self.base_url = base_url

    def start(self):
        return (self.current_page - 1) * self.per_page

    def end(self):
        return self.current_page * self.per_page

    def pager(self):
        half = int((self.show_page - 1) / 2)
        # 如果總頁數小於11
        if self.sum_page_num < self.show_page:
            begin = 1
            stop = self.sum_page_num + 1
        else:
            if self.current_page <= half:
                begin = 1
                stop = self.show_page + 1
            else:
                if self.current_page + half > self.sum_page_num:
                    begin = self.sum_page_num - self.show_page + 1
                    stop = self.sum_page_num + 1
                else:
                    begin = self.current_page - half
                    stop = self.current_page + half + 1
        page_num_list = []
        index_page = '<li><a href="%s?page=1"><span aria-hidden="true">首頁</span></a></li>' % (self.base_url)
        page_num_list.append(index_page)
        if self.current_page <= 1:
            prev_page = '<li><a href="#"><span aria-hidden="true">&laquo;</span></a></li>'
        else:
            prev_page = '<li><a href="%s?page=%s"><span aria-hidden="true">&laquo;</span></a></li>' % (
                self.base_url, self.current_page - 1,)

        page_num_list.append(prev_page)
        for i in range(begin, stop):
            if i == self.current_page:
                page_num_list.append(
                    "<li class='active'><a class='active' href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i))
            else:
                page_num_list.append("<li><a class='active' href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i))
        if self.current_page >= self.sum_page_num:
            next_page = '<li><a href="#"><span aria-hidden="true">&raquo;</span></a></li>'
        else:
            next_page = '<li><a href="%s?page=%s"><span aria-hidden="true">&raquo;</span></a></li>' % (
                self.base_url, self.current_page + 1,)
        page_num_list.append(next_page)

        final_page = '<li><a href="%s?page=%s"><span aria-hidden="true"></span>最後一頁</a></li>' % (
            self.base_url, self.sum_page_num)
        page_num_list.append(final_page)
        return ''.join(page_num_list)


def index(request):
    count_sum = models.UserInfo.objects.count()
    page_info = PageInfo(request.GET.get('page'), 1, count_sum, '/index.html')
    user_info = models.UserInfo.objects.all()[page_info.start():page_info.end()]
    return render(request, 'index.html', {'user_info': user_info, 'page_info': page_info})

視圖View部分的代碼:

...
<table class="table table-bordered">
    <tr>
        <th>用戶名</th>
        <th>年齡</th>
    </tr>
    {% for item in user_info %}
        <tr>
            <td> {{ item.name }}</td>
            <td> {{ item.age }}</td>
        </tr>
    {% endfor %}
</table>
<nav aria-label="Page navigation">
    <ul class="pagination">
        {{ page_info.pager|safe }}
    </ul>
</nav>
...
3. 分頁插件

可以把控制器部分的PageInfo類放在單獨的Python文件中,可以複用。新建utils目錄,然後將其放在utils目錄下:

pager.py

class PageInfo:
    def __init__(self, current_page, per_page, count_sum, base_url, show_page=11):
        """
        :param current_page:當前的頁碼
        :param per_page:每頁顯示的數據量
        :param count_sum:總的數據量
        """
        try:
            self.current_page = int(current_page)
        except Exception as e:
            self.current_page = 1
        self.per_page = per_page
        self.count_sum = count_sum
        a, b = divmod(count_sum, per_page)
        if b:
            a += 1
        # page_num:所有頁碼的數量
        self.sum_page_num = a
        self.show_page = show_page
        self.base_url = base_url

    def start(self):
        return (self.current_page - 1) * self.per_page

    def end(self):
        return self.current_page * self.per_page

    def pager(self):
        half = int((self.show_page - 1) / 2)
        # 如果總頁數小於11
        if self.sum_page_num < self.show_page:
            begin = 1
            stop = self.sum_page_num + 1
        else:
            if self.current_page <= half:
                begin = 1
                stop = self.show_page + 1
            else:
                if self.current_page + half > self.sum_page_num:
                    begin = self.sum_page_num - self.show_page + 1
                    stop = self.sum_page_num + 1
                else:
                    begin = self.current_page - half
                    stop = self.current_page + half + 1
        page_num_list = []
        index_page = '<li><a href="%s?page=1"><span aria-hidden="true">首頁</span></a></li>' % (self.base_url)
        page_num_list.append(index_page)
        if self.current_page <= 1:
            prev_page = '<li><a href="#"><span aria-hidden="true">&laquo;</span></a></li>'
        else:
            prev_page = '<li><a href="%s?page=%s"><span aria-hidden="true">&laquo;</span></a></li>' % (
                self.base_url, self.current_page - 1,)

        page_num_list.append(prev_page)
        for i in range(begin, stop):
            if i == self.current_page:
                page_num_list.append(
                    "<li class='active'><a class='active' href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i))
            else:
                page_num_list.append("<li><a class='active' href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i))
        if self.current_page >= self.sum_page_num:
            next_page = '<li><a href="#"><span aria-hidden="true">&raquo;</span></a></li>'
        else:
            next_page = '<li><a href="%s?page=%s"><span aria-hidden="true">&raquo;</span></a></li>' % (
                self.base_url, self.current_page + 1,)
        page_num_list.append(next_page)

        final_page = '<li><a href="%s?page=%s"><span aria-hidden="true"></span>最後一頁</a></li>' % (
            self.base_url, self.sum_page_num)
        page_num_list.append(final_page)
        return ''.join(page_num_list)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章