1. 程式人生 > >9.18 關於分頁的方法

9.18 關於分頁的方法

view init efi 按鈕 一半 obj def books dep

2018-9-18 17:38:24

數據比較多少的時候需要分頁!

所有就引出了分頁 根據if 判斷分頁!邏輯很重要!但牽扯到的都是基礎知識

先放上原始版的views 的功能代碼

明天再看下午內容!

from django.shortcuts import render

# Create your views here.
from app01 import models


def books(request):
    # 從URL取參數
    page_num = request.GET.get("page")
    print(page_num, type(page_num))

    
# 總數據是多少 total_count = models.Book.objects.all().count() # # 每一頁顯示多少條數據 # per_page = 10 # # # 總共需要多少頁碼來展示 # total_page, m = divmod(total_count, per_page) # if m: # total_page += 1 # try: # page_num = int(page_num) # # 如果輸入的頁碼數超過了最大的頁碼數,默認返回最後一頁
# if page_num > total_page: # page_num = total_page # except Exception as e: # # 當輸入的頁碼不是正經數字的時候 默認返回第一頁的數據 # page_num = 1 # # # 定義兩個變量保存數據從哪兒取到哪兒 # data_start = (page_num-1)*10 # data_end = page_num*10 # # # 頁面上總共展示多少頁碼 # max_page = 11
# if total_page < max_page: # max_page = total_page # # half_max_page = max_page // 2 # # 頁面上展示的頁碼從哪兒開始 # page_start = page_num - half_max_page # # 頁面上展示的頁碼到哪兒結束 # page_end = page_num + half_max_page # # 如果當前頁減一半 比1還小 # if page_start <= 1: # page_start = 1 # page_end = max_page # # 如果 當前頁 加 一半 比總頁碼數還大 # if page_end >= total_page: # page_end = total_page # page_start = total_page - max_page +1 # # all_book = models.Book.objects.all()[data_start:data_end] # # # 自己拼接分頁的HTML代碼 # html_str_list = [] # # 加上第一頁 # html_str_list.append(‘<li><a href="/books/?page=1">首頁</a></li>‘) # # # 判斷一下 如果是第一頁,就沒有上一頁 # if page_num <= 1: # html_str_list.append(‘<li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span></a></li>‘.format(page_num-1)) # else: # # 加一個上一頁的標簽 # html_str_list.append(‘<li><a href="/books/?page={}"><span aria-hidden="true">&laquo;</span></a></li>‘.format(page_num-1)) # # for i in range(page_start, page_end+1): # # 如果是當前頁就加一個active樣式類 # if i == page_num: # tmp = ‘<li class="active"><a href="/books/?page={0}">{0}</a></li>‘.format(i) # else: # tmp = ‘<li><a href="/books/?page={0}">{0}</a></li>‘.format(i) # # html_str_list.append(tmp) # # # 加一個下一頁的按鈕 # # 判斷,如果是最後一頁,就沒有下一頁 # if page_num >= total_page: # html_str_list.append(‘<li class="disabled"><a href="#"><span aria-hidden="true">&raquo;</span></a></li>‘) # else: # html_str_list.append(‘<li><a href="/books/?page={}"><span aria-hidden="true">&raquo;</span></a></li>‘.format(page_num+1)) # # 加最後一頁 # html_str_list.append(‘<li><a href="/books/?page={}">尾頁</a></li>‘.format(total_page)) # # page_html = "".join(html_str_list) # # 調用一個類 from utils.mypage import Page page_obj = Page(page_num, total_count, per_page=10, url_prefix="/books/", max_page=9,) ret = models.Book.objects.all()[page_obj.start:page_obj.end] page_html = page_obj.page_html() return render(request, "books.html", {"books": ret, "page_html": page_html}) def depts(request): # 從URL取參數 page_num = request.GET.get("page") print(page_num, type(page_num)) # 總數據是多少 total_count = models.Dept.objects.all().count() from utils.mypage import Page page_obj = Page(page_num, total_count, per_page=10, url_prefix="/depts/", max_page=11, ) ret = models.Dept.objects.all()[page_obj.start:page_obj.end] print(ret) page_html = page_obj.page_html() return render(request, "dept.html", {"depts": ret, "page_html": page_html})

再放上 直接 封裝一個類 實現功能!! 面向對象 封裝!

class Page():

    def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11):
        """

        :param page_num: 當前頁碼數
        :param total_count: 數據總數
        :param url_prefix: a標簽href的前綴
        :param per_page: 每頁顯示多少條數據
        :param max_page: 頁面上最多顯示幾個頁碼
        """
        self.url_prefix = url_prefix
        self.max_page = max_page
        # 每一頁顯示多少條數據
        # 總共需要多少頁碼來展示
        total_page, m = divmod(total_count, per_page)
        if m:
            total_page += 1
        self.total_page = total_page

        try:
            page_num = int(page_num)
            # 如果輸入的頁碼數超過了最大的頁碼數,默認返回最後一頁
            if page_num > total_page:
                page_num = total_page
        except Exception as e:
            # 當輸入的頁碼不是正經數字的時候 默認返回第一頁的數據
            page_num = 1
        self.page_num = page_num

        # 定義兩個變量保存數據從哪兒取到哪兒
        self.data_start = (page_num - 1) * 10
        self.data_end = page_num * 10

        # 頁面上總共展示多少頁碼
        if total_page < self.max_page:
            self.max_page = total_page

        half_max_page = self.max_page // 2
        # 頁面上展示的頁碼從哪兒開始
        page_start = page_num - half_max_page
        # 頁面上展示的頁碼到哪兒結束
        page_end = page_num + half_max_page
        # 如果當前頁減一半 比1還小
        if page_start <= 1:
            page_start = 1
            page_end = self.max_page
        # 如果 當前頁 加 一半 比總頁碼數還大
        if page_end >= total_page:
            page_end = total_page
            page_start = total_page - self.max_page + 1
        self.page_start = page_start
        self.page_end = page_end

    @property
    def start(self):
        return self.data_start

    @property
    def end(self):
        return self.data_end


    def page_html(self):
        # 自己拼接分頁的HTML代碼
        html_str_list = []
        # 加上第一頁
        html_str_list.append(<li><a href="{}?page=1">首頁</a></li>.format( self.url_prefix))

        # 判斷一下 如果是第一頁,就沒有上一頁
        if self.page_num <= 1:
            html_str_list.append(<li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span></a></li>.format(self.page_num-1))
        else:
            # 加一個上一頁的標簽
            html_str_list.append(<li><a href="{}?page={}"><span aria-hidden="true">&laquo;</span></a></li>.format( self.url_prefix, self.page_num-1))

        for i in range(self.page_start, self.page_end+1):
            # 如果是當前頁就加一個active樣式類
            if i == self.page_num:
                tmp = <li class="active"><a href="{0}?page={1}">{1}</a></li>.format(self.url_prefix, i)
            else:
                tmp = <li><a href="{0}?page={1}">{1}</a></li>.format( self.url_prefix, i)

            html_str_list.append(tmp)

        # 加一個下一頁的按鈕
        # 判斷,如果是最後一頁,就沒有下一頁
        if self.page_num >= self.total_page:
            html_str_list.append(<li class="disabled"><a href="#"><span aria-hidden="true">&raquo;</span></a></li>)
        else:
            html_str_list.append(<li><a href="{}?page={}"><span aria-hidden="true">&raquo;</span></a></li>.format( self.url_prefix, self.page_num+1))
        # 加最後一頁
        html_str_list.append(<li><a href="{}?page={}">尾頁</a></li>.format( self.url_prefix, self.total_page))

        page_html = "".join(html_str_list)
        return page_html

9.18 關於分頁的方法