Django分頁器和優化

2021-09-29 05:51:20 字數 4129 閱讀 7848

django分頁器和優化

django 自帶分頁器的使用

if request.method == 'get':

return render(request, 'all_crawl/show_all.html', )

# 每10頁進行分頁

# paginator 分頁器的例項化

else:

print('11111111', paginator)

page_num = request.get.get('page', 1) # 獲取get請求的內容,預設為1 獲取url的頁面引數(get請求)

print('222222222222', page_num)

page_of_blogs = paginator.get_page(page_num) # 將獲取的第幾頁的文章列表值給賦值,get方法會自動處理異常

print('33333333333', page_of_blogs)

current_page_num = page_of_blogs.number # 獲取當前頁碼

print('44444444', current_page_num)

# 頁面範圍 顯示 分頁時的 結果, 就是如果有多個分頁,不完全顯示,就顯示4個頁面

# 獲取當前頁碼和 當前頁碼的前後兩頁

page_range = list(range(max(current_page_num - 2, 1), current_page_num)) + \

list(range(current_page_num, min(current_page_num + 2, paginator.num_pages) + 1))

print('555555555', page_range)

# 加上省略頁碼

if page_range[0] - 1 >= 2:

page_range.insert(0, '...')

if paginator.num_pages - page_range[-1] >= 2:

# 加上首頁和尾頁

if page_range[0] != 1:

page_range.insert(0, 1)

if page_range[-1] != paginator.num_pages:

print('6666666', page_range)

return render(request, 'all_crawl/show_all.html',

context=)

自帶的分頁器方便,使用時簡潔,但是當資料過多時,查詢展示會卡頓,自帶將不適用,這是與底層封裝查詢方式問題,下面的是

# 封裝分頁

class page(object):

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轉換為int型別

page_num = int(page_num)

except exception as e:

# 當輸入的頁碼不是正經數字的時候 預設返回第一頁的資料

page_num = 1

# 如果輸入的頁碼數超過了最大的頁碼數,預設返回最後一頁

if page_num > total_page:

page_num = total_page

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

# self.page_start = page_start

# 頁面上展示的頁碼到哪兒結束

page_end = page_num + half_max_page

# self.page_end = page_end

# 如果當前頁減一半 比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 =

# # 加上首頁

'.format(self.url_prefix))

if self.page_num <= 1:

') else:

'«'.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 = '

'.format(self.url_prefix, i)

else:

tmp = '

'.format(self.url_prefix, i)

if self.page_num >= self.total_page:

') else:

'»'.format(self.url_prefix,

self.page_num + 1))

# 加上尾頁

'.format(self.url_prefix, self.total_page))

page_html = "".join(html_str_list)

return page_html

#呼叫方式 傳入相應的引數

def c_fenye(request):

page_num = request.get.get("page")

# 呼叫封裝的page類,傳入相應的引數

page_obj = page(page_num, total_count, url_prefix="", per_page=10, max_page=11)

page_html = page_obj.page_html()

return render(request, 'ceshifenye.html', )

django 裝飾器和分頁器

2.建立裝飾器 else url request.get full path ret redirect reverse users user login ret.set cookie url url return ret return login handler views.py 登入檢視函式中 實...

django 裝飾器和分頁器

2.建立裝飾器 else url request.get full path ret redirect reverse users user login ret.set cookie url url return ret return login handler views.py 登入檢視函式中 實...

Django元件 分頁器

批量匯入資料 booklist for i in range 100 book.objects.bulk create booklist 分頁器的使用 book list book.objects.all paginator paginator book list,10 print count pa...