Python 自定義分頁

2021-09-24 14:13:00 字數 3782 閱讀 9396

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

for i in range(start, end + 1):

url = self.get_page_url(self.path, i, i)

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 = ''.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] = ''.format(page)

continue

page_list[index + 1] = ''.format(page)

return page_list

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

"""首頁"""

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', )

由於是後端動態生成頁碼標籤,前段直接遍歷即可。

這裡應用了bootstrap樣式。

具體效果如下:

Python 自定義分頁

使用流程 分頁元件應用 1.在檢視函式中 queryset models.issues.objects.filter project id project id page object pagination current page request.get.get page all count qu...

python 自定義分頁元件

使用方法 自定義分頁元件的使用方法 pager obj pagination request.get.get page 1 len host list request.path info,request.get host list host list pager obj.start pager ob...

自定義分頁

分頁 public string madebuttonlink int pagecount,int curpage,string szurl pagecount得到頁數 curpage當前頁 szurl連線位址 public int getpagecount string sztable,int l...