<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
先上整體效果圖:
然後是分頁圖詳情:
與本例相關的路由和模板包括:
路由:views.py
@app.route('/blog/list/<int:page>', methods=['GET']) @login_required def blog_list(page=None): ...
模板:blog_list.html和pages.html
blog_list.html作為部落格頁面,pages.html模板為分頁頁面,呈現時會在blog_list.html中匯入pages.html的內容。
{%import 'pages.html' as pg%} {{pg.my_paginage(pagination,'art_list')}}
首先從路由開始:
路由的設計思路是根據查詢的頁碼作為引數,利用FlaskSQLAlchemy的Model進行查詢並對查詢結果進行分頁處理。
@app.route('/blog/list/<int:page>', methods=['GET']) @login_required def blog_list(page=None): #每個人只能看自己發表的blog if not page: page = 1 from models import Blog from models import User user_id = User.query.filter_by(username=session['user']).first().id #paginate方法返回一個sqlalchemy.Pagination型別物件 blogs = Blog.query.filter_by(user_id=user_id).order_by(Blog.addtime.desc()).paginate(page=page,per_page=3) category=[(1, '情感'), (2, '星座'), (3, '愛情')] return render_template('blog_list.html', title='部落格列表',session=session,blogs=blogs.items,category=category,pagination=blogs)
分析一下上述程式碼:
1. @app.route裝飾器定義了路由
2. @login_required是自定義裝飾器,用來限定只有登入使用者才可以瀏覽部落格列表,未登入使用者會進入登入頁面
3. 作為Model的Blog中有一個外來鍵屬性user_id參照著使用者表,用來記錄部落格的作者資訊
4. blogs是一個FlaskSQLAlchemy中的Pagination型別物件。一個Query物件呼叫paginate方法就獲得了Pagination物件。paginate方法傳入了兩個引數,一個是當前頁,另一個是每一頁最多顯示多少部落格。paginate的返回值為代表當前頁的Pagination物件。一個Paginationi物件的常用屬性有:
常用方法有:
5. 渲染blog_list.html模板時,傳入渲染時需要的若干引數,比較重要的是傳入blogs引數用來讓模板顯示查詢出來的應該在本頁面中顯示的部落格資訊,另外是傳入pagination引數,利用傳入的Pagination物件的相關屬性方法動態生成分頁的相關內容。
看一下pages.html模板的內容:
{%macro my_paginate(pagination,url)%} <nav> <ul class="pagination"> {%if pagination.has_prev%} <li class="page-item active"><a class="page-link" href="{{url_for(url,page=pagination.page-1)}}" rel="external nofollow" >上一頁</a></li> {%else%} <li class="page-item disabled"><a class="page-link" href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" >上一頁</a></li> {%endif%} {%for page in pagination.iter_pages(1,1,3,1)%} {%if page%} <li class="page-item {%if page==pagination.page%}active{%endif%}"><a class="page-link" href="{{url_for(url,page=page)}}" rel="external nofollow" >{{page}}</a></li> {%else%} <li class="page-item disabled"><a class="page-link" href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" >…</a></li> {%endif%} {%endfor%} {%if pagination.has_next%} <li class="page-item active"><a class="page-link" href="{{url_for(url,page=pagination.page+1)}}" rel="external nofollow" >下一頁</a></li> {%else%} <li class="page-item disabled"><a class="page-link" href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" >下一頁</a></li> {%endif%} </ul> </nav> {%endmacro%}
分析一下上述頁面程式碼:、
整體來說就是根據當前對“上一頁”,“頁碼”和“下一頁”進行不同的設定
1. 使用JinJa2的宏,定義my_paginate方法,傳入路徑和pagination物件作為引數。通過呼叫宏的執行生成分頁內容。
2. 通過設定class為pagination,可以使用FlaskBootStrap預置CSS樣式
3. 利用JinJa2的if語句根據當前頁是否還有前一頁使用不同的元素和class。
如果當前頁有上一頁,則pagination物件的has_prev為True,此時li標籤的class為page-item和active,採用的BootStrap樣式意 為此時上一頁是可點的。點選後跳轉的連結會是url_for函數根據傳入的路由方法名稱(也就是url引數值)並新增上page引數,引數值為當前頁碼-1
如果當前頁沒有上一頁,則pagination物件的has_prev為False,此時li標籤的class為page-item和disable,採用的BootStrap樣 式意為此時上一頁是不可點的。跳轉的連結會是#
4. 與“上一頁”處理類似的是對“下一頁”的處理。如果當前頁有下一頁時設定樣式和點選跳轉路徑,如果沒有下一頁了,則設定為 不可點選並且跳轉路徑為#
5. 利用iter_page(1,1,3,1)會獲得基於當前頁應該顯示的頁碼列表。如上面截圖所示,如果當前頁是第4頁,獲得的分頁列表內容 就是[1,None,3,4,5,6,None,9],如果當前頁是第9頁,獲得的分頁列表內容是[1,None,8,9]
6. 利用JinJa2的for語句遍歷列表,如果是頁碼,就根據頁碼生成a標籤中的文字並設定跳轉路徑並新增上page引數。如果是None,a標籤中的文字為實體名錶示的省略號,路徑為“#”。額外的,如果遍歷時獲得了當前頁碼所對應的數位時,為li標籤的class屬性新增上額外的active以獲得額外的樣式。
最後在blog_list.html中要引入pages.html
{%import 'pages.html' as pg%} {{pg.my_paginate(pagination,'blog_list')}}
在blog_list.html中匯入pages.html模板並呼叫pages.html中定義的my_pagination宏,傳入兩個引數,第一個引數是pagination物件,這個引數是從views.py中渲染blog_list.html的時候傳入的,另外一個就是一個字串'blog_list',它對應的是views.py中路由方法的名稱,有了這個名稱在my_paginate中就可以利用url_for函數進行路由方法對應路徑的尋找。
到此這篇關於Flask快速實現分頁效果範例的文章就介紹到這了,更多相關Flask 分頁內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45