[TOC]
>[success] # 自定義 分頁
分頁分為兩種,一種自定義,一種用自帶的
>[info] ## 自定義的分頁
>[danger] ##### 思路
~~~
1.當前頁,當前頁可能會被傳入特別的值建議異常就是第一頁
2.底欄展示頁碼
3.數據總個數用來計算生成多少頁
4.每頁展示頁數
~~~
* 首先我們利用切片,把數據分成段落顯示,每一頁的第一條數據是(當前頁-1)*頁面顯示條數
~~~
@property
def start(self):
'''
:return: 開始頁數
'''
return (self.current_page-1)*self.page_count
~~~
* 每頁最后一條數據是(當前頁*顯示條數)
~~~
@property
def end(self):
'''
:return: 結束頁數
'''
return (self.current_page*self.page_count)
~~~
* 頁面的總頁數是總條數/頁面顯示頁數
~~~
@property
def total_count(self):
'''
:return: 總頁數
'''
v, y = divmod(self.data_count,self.page_count)
if y:
v +=1
return v
~~~
* 頁面展示的條數也就是循環次數
~~~
1.當總頁數小于頁面實際展示頁數時,開始頁1,結束頁實際頁數
2.當總頁數大于頁面實際展示頁數時
3.第一種情況當前頁小于中間頁,開始頁1,結束頁是頁面展示底欄
4.第二種情況當前頁大于中間頁,開始頁當前頁-(中間頁-1)/2,結束頁(當前頁+1)/2
5.當然第二種的前提建立在(當前頁+(中間頁-1)/2)大于總頁數
6.開始頁總頁數-底欄數-1,結束頁等于總頁數+1
~~~
>[danger] ##### 代碼
| 參數 |意義|
| --- | --- |
| current_page | 當前頁 |
| data_count | 數據庫總條數 |
| per_page_count | 每頁顯示條數 |
| pager_num | 顯示幾個頁碼欄 |
|base_url|當前連接|
~~~
from django.utils.safestring import mark_safe
class Pagination(object):
def __init__(self, current_page, data_count, per_page_count=1, pager_num=7):
try:
self.current_page = int(current_page)
except Exception as e:
self.current_page = 1
self.data_count = data_count
self.per_page_count = per_page_count
self.pager_num = pager_num
@property
def start(self):
return (self.current_page - 1) * self.per_page_count
@property
def end(self):
return self.current_page * self.per_page_count
@property
def total_count(self):
v, y = divmod(self.data_count, self.per_page_count)
if y:
v += 1
return v
def page_str(self, base_url):
page_list = []
if self.total_count < self.pager_num:
start_index = 1
end_index = self.total_count + 1
else:
if self.current_page <= (self.pager_num + 1) / 2:
start_index = 1
end_index = self.pager_num + 1
else:
start_index = self.current_page - (self.pager_num - 1) / 2
end_index = self.current_page + (self.pager_num + 1) / 2
if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
end_index = self.total_count + 1
start_index = self.total_count - self.pager_num + 1
if self.current_page == 1:
prev = '<li><a class="page" href="javascript:void(0);">上一頁</a></li>'
else:
prev = '<li><a class="page" href="%s?p=%s">上一頁</a></li>' % (base_url, self.current_page - 1,)
page_list.append(prev)
for i in range(int(start_index), int(end_index)):
if i == self.current_page:
temp = '<li class="active"><a class="page active" href="%s?p=%s">%s</a></li>' % (base_url, i, i)
else:
temp = '<li><a class="page" href="%s?p=%s">%s</a></li>' % (base_url, i, i)
page_list.append(temp)
if self.current_page >= self.total_count:
nex = '<li><a class="page" href="javascript:void(0);">下一頁</a></li>'
else:
nex = '<li><a class="page" href="%s?p=%s">下一頁</a></li>' % (base_url, self.current_page + 1,)
page_list.append(nex)
# jump = """
# <input type='text' /><a onclick='jumpTo(this, "%s?p=");'>GO</a>
# <script>
# function jumpTo(ths,base){
# var val = ths.previousSibling.value;
# location.href = base + val;
# }
# </script>
# """ % (base_url,)
#
# page_list.append(jump)
page_str = mark_safe("".join(page_list))
return page_str
~~~
>[success] 用法
~~~
1.取出所有條數
2.獲取當前頁碼
3.對數據做切片
4.獲取當前連接
~~~
~~~
def index(request):
datacount = models.userInfo.objects.count()
page_obj = Pagination(request.GET.get('p'),datacount)
userinfo = models.userInfo.objects.all()[page_obj.start:page_obj.end]
print(page_obj.start,page_obj.end)
base_url = reverse('index', )
page_str = page_obj.page_str(base_url)
return render(request, "index.html", {
'userinfo': userinfo,
'page_str': page_str,
})
~~~
>[success] # Django 自帶的分頁
>[info] ## 基本參數介紹
>[danger] ##### 引入類
~~~
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
~~~
>[danger] ##### 使用
~~~
1.第一個參數必須為list
2.每頁展示個數
paginator = Paginator(list(obj_count), 1)
~~~
* 這里面封裝的方法有
~~~
1.per_page: 每頁顯示條目數量
2.count: 數據總個數
3.num_pages:總頁數
4.page_range:總頁數的索引范圍,如: range(1, 6) 頁數循環
5.page: page對象(是否具有上一頁,下一頁)
~~~
* page 對象有
~~~
1. has_next 是否有下一頁
2. next_page_number 下一頁頁碼
3. has_previous 是否有上一頁
4. previous_page_number 上一頁頁碼
5. object_list 分頁之后的數據列表
6. number 當前頁
7. paginator paginator對象
~~~
>[danger] views代碼
~~~
def index(request):
obj_count = models.userInfo.objects.all()
paginator = Paginator(list(obj_count), 2)
current_page = request.GET.get('page')
try:
posts = paginator.page(current_page)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
except PageNotAnInteger:
posts = paginator.page(1)
return render(request, 'index.html', {'posts': posts})
~~~
>[danger] html
~~~
//是否有上一頁
{% if posts.has_previous %}
<a href="/index1?page={{ posts.previous_page_number }}">上一頁</a>
//沒有上一頁,不讓點擊
{% else %}
<a href="#">上一頁</a>
{% endif %}
//是否有下一頁
{% if posts.has_next%}
<a href="/index1?page={{ posts.next_page_number }}">下一頁</a>
//沒有下一頁,不讓點擊
{% else %}
<a href="#">下一頁</a>
{% endif %}
~~~
* 數據展示
~~~
<ul>
{% for i in posts %}
<li>{{ i }}</li>
{% endfor %}
</ul>
~~~
>[danger] ##### 升級版本自定制
~~~
#保證循環的次數在規定的展示欄個數,如果設置11,循環的次數保證在11次
class CustomPaginator(Paginator):
def __init__(self, current_page, per_pager_num,*args, **kwargs):
'''
:param current_page: 當前頁
:param per_pager_num: 底邊欄展示頁數
'''
self.current_page = int(current_page)
self.per_pager_num = int(per_pager_num)
super(CustomPaginator, self).__init__(*args, **kwargs)
def page_num_range(self):
#總頁數小于實際展示頁
if self.num_pages < self.per_pager_num:
return range(1,self.num_pages+1)
#part 當前總展示欄中間點5
part = int(self.per_pager_num//2)
#最小頁數為1防止出現負數情況
if self.current_page <= part:
return range(1,self.per_pager_num+1)
#最大頁數為實際總頁數
if(self.current_page+part)>self.num_pages:
return range(self.num_pages-self.per_pager_num+1,self.num_pages+1)
return range(self.current_page-part,self.current_page+part+1)
~~~

- 網絡原理
- 為搭建框架做準備
- 簡單認識網路
- 自定義模擬網站案例
- 優化最終框架
- 數據存儲 -- data
- 用戶個人信息存儲 -- User.txt
- 路由映射 -- routes
- 處理用戶信息 -- routes_static.py
- 保存靜態文件 -- static
- templates -- html 集中處理模塊
- 首頁 -- index.html
- 登陸 -- login.html
- 用戶注冊頁面 -- register
- 日志模塊 -- log.gua.txt
- 啟動文件--server.py
- orm處理 -- model.py
- 日志模塊 -- utils.py
- 兩種數據庫類型
- 傳統數據庫了解篇
- 前端快速入門
- JS簡單使用入門
- css簡單快速入門
- DJANGO
- virtualenv-創建虛擬環境
- 項目結構
- django-admin中文配置
- django-打印sql語句
- django-基礎
- 認識MVC和MTV
- Django--初識
- Django--初識案例
- Django-FBV/CBV
- Django--常用input 交互
- Django-url
- Django-url.py 配置
- Django-include 使用
- Django-url name
- Django-ORM
- ORM-數據庫配置
- ORM-model字段
- ORM-model字段解釋
- ORM-字段選項
- ORM-查詢
- ORM-四種常用查詢方法
- ORM-三種獲取數據
- ORM-其他查詢方式
- ORM-條件查詢雙線
- ORM-Q和F條件使用
- ORM-三種數據庫交互
- 案例 -- 一對多
- ORM-技巧/常見問題
- ORM-N+1 問題
- ORM-并發的處理
- ORM-數量查詢、
- ORM-正向反向查詢
- ORM-基礎案例一
- ORM-基礎一對多案例
- Django-templates
- Django-模板的繼承
- Django-模板的過濾
- Django-自定義模板的過濾
- Django-cookie
- Django-cookies 裝飾器
- Djang-session
- Django-CSRF
- Django-中間件 -- 后續了解
- Django- 緩存 -- 沒有深入了解
- Django-form
- From-ajax
- form-內部驗證處理
- form-屬性
- form-常用的標簽字段
- form-常用的下拉和選擇
- form-widget速查
- Django-ajax序列化
- Django-多種ajax寫法
- ajax-原生寫法
- ajax-$寫法
- ajax-ifram
- Django-ajax圖片上傳
- ajax-原始寫法
- ajax-正常寫法
- iframe+form
- 實戰寫法
- Django-常用自編寫組件
- Django-雙菜單組合搜索
- Django - 多菜單組合搜索
- Django-分頁
- django-綜合基礎
- 綜合基礎-render
- django-admin
- admin-頁面配置
- admin-字段配置
- admin-編輯頁面
- admin-forms驗證
- admin-創建抽象類
- django-驗證碼
- 驗證碼-第三方生成庫
- 驗證碼-view.py使用
- 驗證碼-注意引入Monaco.ttf
- django-用戶注冊
- 注冊-form 模塊
- 注冊-views 模塊
- 注冊-html模塊
- 注冊-model模塊
- django-用戶登錄三種
- session登錄
- form-session 寫法
- view-寫法
- Html-寫法
- model-寫法
- 繼承類登錄
- 外鍵關聯登錄
- django-簡單的student 管理案例
- app-urls.py
- app-models.py配置
- admin-admin.py配置
- app-form.py 和數據庫關聯的寫法
- app-FBV_views.py
- app-CBV_views.py
- templates-index.html
- django-博客系統
- APP目錄-models.py 創建
- APP目錄-基礎展示數據分析
- APP目錄-基礎數據展示cls
- ListView
- DetailView
- FormView
- 額外功能拓建
- 添加文章搜索/用戶文章查詢功能
- 增加一個友情鏈接
- 增加一個評論模塊
- App-利用Bootstrap4 搭建樣式
- 項目crm
- 思維導圖
- perfectCRM-項目名字
- settings.py-配置
- view.py-登陸/登出函數
- crm-app文件
- model.py-表的創建
- admin.py-注冊后臺
- view.py-視圖層
- static-靜態文件
- css
- bootstrap.min.css
- dashboard.css
- ie10-viewport-bug-workaround.css
- signin.css
- fonts
- imgs
- js
- jquery.js
- bootstrap.min.js
- holeder.js
- ie10-viewport-bug-workaround.js
- ie-emulation-modes-warning.js
- plugins
- html模板文件-templates
- crm
- index.html-首頁模板