亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Python】自定義分頁

系統 1812 0

?Django內置了分頁設置,但不夠靈活,需要我們自定義分頁。

下面代碼考慮了利用bootstrap分頁組件來實現頁面美化,如果不想使用,可以不調用url_format_by_bootstrap函數,即可實現普通分頁。

具體的參數和代碼均有注釋

            
              #! python3
# @Project:  mysite2 - pager.py
# @Info   :  自定義分頁操作
import re


class PageInfo:
    """
        :param current_page 當前頁碼
        :param data 要分頁的數據
        :param path 路由地址(用于生成動態路徑)
        :param per_page 每頁顯示條數
        :param show_page 顯示頁碼跨度
    """

    def __init__(self, current_page, data, path, per_page=10, show_page=10):
        self.current_page = current_page
        self.per_page = per_page
        self.show_page = show_page
        self.data = data
        self.path = path
        self.all_page = self.get_all_page()

    def get_all_page(self):
        """計算總頁數"""
        result, mod = divmod(len(self.data), self.per_page)
        if mod:
            return result + 1
        else:
            return result

    def create_page(self):
        """創建頁碼列表"""
        if not (isinstance(self.show_page, int) | self.show_page < 1):
            self.show_page = 10

        half = self.show_page // 2
        start = self.current_page - half
        end = self.current_page + half

        #  避免出現負數頁
        if self.current_page - half <= 0:
            start = 1
        if self.current_page + half > self.all_page:
            end = self.all_page
        # 若當前頁靠近兩端,保持頁面達到show_page的數量
        if self.current_page <= half:
            end = self.show_page + 1
        if self.current_page >= self.all_page - half:
            start = self.all_page - self.show_page
        # 上下頁
        page_list = []
        pre_page = self.current_page - 1 if self.current_page - 1 > 0 else 1
        next_page = self.current_page + 1 if self.current_page + 1 < self.all_page else self.all_page
        # 將生成的頁碼標簽添加進page_list
        page_list.append(self.get_page_url(self.path, '上一頁', pre_page))
        for i in range(start, end + 1):
            url = self.get_page_url(self.path, i, i)
            page_list.append(url)
        page_list.append(self.get_page_url(self.path, '下一頁', next_page))

        return self.url_format_by_bootstrap(page_list)

    def per_page_content(self, data):
        """計算每頁內容"""
        start_index = (self.current_page - 1) * self.per_page
        end_index = self.current_page * self.per_page
        return data[start_index:end_index]

    #  聲明為靜態方法,未使用類中變量
    @staticmethod
    def get_page_url(path, text, num):
        """獲取動態頁碼鏈接"""
        url = '
              
                {2}
              
              '.format(path, num, text)
        return url

    def url_format_by_bootstrap(self, page_list):
        """將url轉化為bootstrap分頁需要的格式"""
        pre_url = re.findall('href="(.*?)"', page_list[0])[0]
        next_url = re.findall('href="(.*?)"', page_list[-1])[0]
        page_list[0] = '''
                        
              
  • '''.format(pre_url) page_list[-1] = '''
  • '''.format(next_url) for index, page in enumerate(page_list[1:-1]): # 將當前頁設置為選中狀態 page_num = int(re.search(r'page=(\d+)', page).group(1)) if self.current_page == page_num: page_list[index + 1] = '
  • {0}
  • '.format(page) continue page_list[index + 1] = '
  • {0}
  • '.format(page) return page_list

    在view頁面只需要傳參數就可生成頁碼

                
                  import logging
    
    from django.http import HttpResponse
    from django.shortcuts import render
    from . import models
    from utils.pager import PageInfo
    
    
    def index(request):
        """首頁"""
        try:
            current_page_num = int(request.GET['page'])
        except Exception as e:
            logging.log(logging.ERROR, e)
            current_page_num = 1
        data = models.UserInfo.objects.all()
        page_info = PageInfo(current_page_num, data, '/index')
        page_list = page_info.create_page()
        user_list = page_info.per_page_content(data)
        return render(request, 'index.html', {'user_list': user_list, 'page_list': page_list})
                
              

    由于是后端動態生成頁碼標簽,前段直接遍歷即可。

    這里應用了bootstrap樣式。

                
                  
                  
                  
                    Title
                  
                  

    用戶列表

      {% for row in user_list %}
    • {{ row.username }}
    • {% endfor %}

    具體效果如下:

    【Python】自定義分頁_第1張圖片


    更多文章、技術交流、商務合作、聯系博主

    微信掃碼或搜索:z360901061

    微信掃一掃加我為好友

    QQ號聯系: 360901061

    您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

    【本文對您有幫助就好】

    您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

    發表我的評論
    最新評論 總共0條評論
    主站蜘蛛池模板: 亚洲人成影院午夜网站 | 久久精品香蕉 | 久久狠狠婷婷丁香香蕉 | 久久777国产线看观看精品卜 | 天天做天天爱夜夜想毛片 | 青青青国产高清免费视频 | 毛片色毛片18毛片美女 | 亚洲一区二区三区高清不卡 | 人人做人人爽久久久精品 | 99在线精品免费视频九九视 | 精品一区二区三区在线观看视频 | 四虎精品在线观看 | 色偷偷91综合久久噜噜 | 老子午夜精品我不卡影院 | 综合亚洲欧美日韩一区二区 | 日韩伊人网 | 一本大道久久a久久综合 | 99久久久精品免费观看国产 | 人人夜 | 亚洲精品美女一区二区三区乱码 | 亚洲 欧美 另类中文字幕 | 日本中文字幕一区二区高清在线 | 国产午夜精品福利视频 | 亚洲国产精品免费视频 | 久久久久国产午夜 | 亚洲qingse中文字幕久久 | 狠狠色噜噜噜噜狠狠狠狠狠狠奇米 | 日本免费久久 | 精品国产影院 | 妞干网这里只有精品 | 成年女人色毛片免费 | 久久亚洲国产伦理 | 亚洲精品一区专区 | 亚洲成人国产 | 久热re在线视频精品免费 | 一级片免费网址 | 黄色α片 | 妖精视频一区二区三区 | 精品久久九九 | 亚洲狠狠 | 手机在线精品视频 |