欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Flask快速實(shí)現(xiàn)分頁效果示例

 更新時(shí)間:2022年08月19日 12:08:30   作者:哦...  
本文主要介紹了Flask快速實(shí)現(xiàn)分頁效果示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

先上整體效果圖:

然后是分頁圖詳情:

與本例相關(guān)的路由和模板包括:

路由: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模板為分頁頁面,呈現(xiàn)時(shí)會(huì)在blog_list.html中導(dǎo)入pages.html的內(nèi)容。

{%import 'pages.html' as pg%}
{{pg.my_paginage(pagination,'art_list')}}

首先從路由開始:

路由的設(shè)計(jì)思路是根據(jù)查詢的頁碼作為參數(shù),利用FlaskSQLAlchemy的Model進(jìn)行查詢并對(duì)查詢結(jié)果進(jìn)行分頁處理。

@app.route('/blog/list/<int:page>', methods=['GET'])
@login_required
def blog_list(page=None):
    #每個(gè)人只能看自己發(fā)表的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方法返回一個(gè)sqlalchemy.Pagination類型對(duì)象
    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是自定義裝飾器,用來限定只有登錄用戶才可以瀏覽博客列表,未登錄用戶會(huì)進(jìn)入登錄頁面

3. 作為Model的Blog中有一個(gè)外鍵屬性u(píng)ser_id引用著用戶表,用來記錄博客的作者信息

4. blogs是一個(gè)FlaskSQLAlchemy中的Pagination類型對(duì)象。一個(gè)Query對(duì)象調(diào)用paginate方法就獲得了Pagination對(duì)象。paginate方法傳入了兩個(gè)參數(shù),一個(gè)是當(dāng)前頁,另一個(gè)是每一頁最多顯示多少博客。paginate的返回值為代表當(dāng)前頁的Pagination對(duì)象。一個(gè)Paginationi對(duì)象的常用屬性有:

  • items 當(dāng)前頁面中的所有記錄(比如當(dāng)前頁上有5條記錄,items就是以列表形式組織這5個(gè)記錄)
  • query 當(dāng)前頁的query對(duì)象(通過query對(duì)象調(diào)用paginate方法獲得的Pagination對(duì)象)
  • page 當(dāng)前頁碼(比如當(dāng)前頁是第5頁,返回5)
  • prev_num 上一頁頁碼
  • next_num 下一頁頁碼
  • has_next 是否有下一頁 True/False
  • has_prev 是否有上一頁 True/False
  • pages 查詢得到的總頁數(shù) per_page 每頁顯示的記錄條數(shù)
  • total 總的記錄條數(shù)

常用方法有:

  • prev() 上一頁的分頁對(duì)象Pagination
  • next() 下一頁的分頁對(duì)象Pagination
  • iter_pages(left_edge=2,left_current=2,right_current=5,right_edge=2)
  • iter_pages 用來獲得針對(duì)當(dāng)前頁的應(yīng)顯示的分頁頁碼列表。
  • 假設(shè)當(dāng)前共有100頁,當(dāng)前頁為50頁,按照默認(rèn)的參數(shù)設(shè)置調(diào)用iter_pages獲得的列表為:
  • [1,2,None,48,49,50,51,52,53,54,55,None,99,100]

5. 渲染blog_list.html模板時(shí),傳入渲染時(shí)需要的若干參數(shù),比較重要的是傳入blogs參數(shù)用來讓模板顯示查詢出來的應(yīng)該在本頁面中顯示的博客信息,另外是傳入pagination參數(shù),利用傳入的Pagination對(duì)象的相關(guān)屬性方法動(dòng)態(tài)生成分頁的相關(guān)內(nèi)容。

看一下pages.html模板的內(nèi)容:

{%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" >&hellip;</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%}

分析一下上述頁面代碼:、

整體來說就是根據(jù)當(dāng)前對(duì)“上一頁”,“頁碼”和“下一頁”進(jìn)行不同的設(shè)置

1. 使用JinJa2的宏,定義my_paginate方法,傳入路徑和pagination對(duì)象作為參數(shù)。通過調(diào)用宏的執(zhí)行生成分頁內(nèi)容。

2. 通過設(shè)置class為pagination,可以使用FlaskBootStrap預(yù)置CSS樣式

3. 利用JinJa2的if語句根據(jù)當(dāng)前頁是否還有前一頁使用不同的元素和class。

    如果當(dāng)前頁有上一頁,則pagination對(duì)象的has_prev為True,此時(shí)li標(biāo)簽的class為page-item和active,采用的BootStrap樣式意      為此時(shí)上一頁是可點(diǎn)的。點(diǎn)擊后跳轉(zhuǎn)的鏈接會(huì)是url_for函數(shù)根據(jù)傳入的路由方法名稱(也就是url參數(shù)值)并添加上page參數(shù),參數(shù)值為當(dāng)前頁碼-1

    如果當(dāng)前頁沒有上一頁,則pagination對(duì)象的has_prev為False,此時(shí)li標(biāo)簽的class為page-item和disable,采用的BootStrap樣      式意為此時(shí)上一頁是不可點(diǎn)的。跳轉(zhuǎn)的鏈接會(huì)是#

4. 與“上一頁”處理類似的是對(duì)“下一頁”的處理。如果當(dāng)前頁有下一頁時(shí)設(shè)置樣式和點(diǎn)擊跳轉(zhuǎn)路徑,如果沒有下一頁了,則設(shè)置為        不可點(diǎn)擊并且跳轉(zhuǎn)路徑為#

5. 利用iter_page(1,1,3,1)會(huì)獲得基于當(dāng)前頁應(yīng)該顯示的頁碼列表。如上面截圖所示,如果當(dāng)前頁是第4頁,獲得的分頁列表內(nèi)容         就是[1,None,3,4,5,6,None,9],如果當(dāng)前頁是第9頁,獲得的分頁列表內(nèi)容是[1,None,8,9]

6. 利用JinJa2的for語句遍歷列表,如果是頁碼,就根據(jù)頁碼生成a標(biāo)簽中的文字并設(shè)置跳轉(zhuǎn)路徑并添加上page參數(shù)。如果是None,a標(biāo)簽中的文字為實(shí)體名表示的省略號(hào),路徑為“#”。額外的,如果遍歷時(shí)獲得了當(dāng)前頁碼所對(duì)應(yīng)的數(shù)字時(shí),為li標(biāo)簽的class屬性添加上額外的active以獲得額外的樣式。

最后在blog_list.html中要引入pages.html

{%import 'pages.html' as pg%}
{{pg.my_paginate(pagination,'blog_list')}}

在blog_list.html中導(dǎo)入pages.html模板并調(diào)用pages.html中定義的my_pagination宏,傳入兩個(gè)參數(shù),第一個(gè)參數(shù)是pagination對(duì)象,這個(gè)參數(shù)是從views.py中渲染blog_list.html的時(shí)候傳入的,另外一個(gè)就是一個(gè)字符串'blog_list',它對(duì)應(yīng)的是views.py中路由方法的名稱,有了這個(gè)名稱在my_paginate中就可以利用url_for函數(shù)進(jìn)行路由方法對(duì)應(yīng)路徑的尋找。

到此這篇關(guān)于Flask快速實(shí)現(xiàn)分頁效果示例的文章就介紹到這了,更多相關(guān)Flask 分頁內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python圖像處理基本操作總結(jié)(PIL庫、Matplotlib及Numpy)

    python圖像處理基本操作總結(jié)(PIL庫、Matplotlib及Numpy)

    這篇文章主要給大家介紹了關(guān)于python圖像處理基本操作的相關(guān)資料,主要利用的是PIL庫、Matplotlib及Numpy等處理方法,需要的朋友可以參考下
    2021-06-06
  • python使用SQLAlchemy操作MySQL

    python使用SQLAlchemy操作MySQL

    這篇文章主要介紹了python使用SQLAlchemy操作MySQL,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Python?Excel數(shù)據(jù)處理之xlrd/xlwt/xlutils模塊詳解

    Python?Excel數(shù)據(jù)處理之xlrd/xlwt/xlutils模塊詳解

    在復(fù)雜的Excel業(yè)務(wù)數(shù)據(jù)處理中,三兄弟扮演的角色缺一不可。如何能夠使用xlrd/xlwt/xlutils三個(gè)模塊來實(shí)現(xiàn)數(shù)據(jù)處理就是今天的內(nèi)容,希望對(duì)大家有所幫助
    2023-03-03
  • 用python進(jìn)行線性/非線性擬合的三種方法

    用python進(jìn)行線性/非線性擬合的三種方法

    這篇文章主要給大家介紹了關(guān)于用python進(jìn)行線性/非線性擬合的三種方法,數(shù)據(jù)分析中經(jīng)常會(huì)使用到數(shù)據(jù)擬合,文中通過實(shí)例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Django單元測(cè)試工具test client使用詳解

    Django單元測(cè)試工具test client使用詳解

    這篇文章主要介紹了Django單元測(cè)試工具test client使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 完美解決Pycharm無法導(dǎo)入包的問題 Unresolved reference

    完美解決Pycharm無法導(dǎo)入包的問題 Unresolved reference

    今天小編就為大家分享一篇完美解決Pycharm無法導(dǎo)入包的問題 Unresolved reference,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python解釋模型庫Shap實(shí)現(xiàn)機(jī)器學(xué)習(xí)模型輸出可視化

    python解釋模型庫Shap實(shí)現(xiàn)機(jī)器學(xué)習(xí)模型輸出可視化

    Shap 是一個(gè)開源的 python 庫,用于解釋模型。它可以創(chuàng)建多種類型的可視化,有助于了解模型和解釋模型是如何工作的。在本文中,我們將會(huì)分享一些Shap創(chuàng)建的不同類型的機(jī)器學(xué)習(xí)模型可視化
    2021-11-11
  • YOLOv5車牌識(shí)別實(shí)戰(zhàn)教程(三)模型訓(xùn)練與評(píng)估

    YOLOv5車牌識(shí)別實(shí)戰(zhàn)教程(三)模型訓(xùn)練與評(píng)估

    這篇文章主要介紹了YOLOv5車牌識(shí)別實(shí)戰(zhàn)教程(三)模型訓(xùn)練與評(píng)估,在這個(gè)教程中,我們將一步步教你如何使用YOLOv5進(jìn)行車牌識(shí)別,幫助你快速掌握YOLOv5車牌識(shí)別技能,需要的朋友可以參考下
    2023-04-04
  • python實(shí)現(xiàn)猜拳游戲項(xiàng)目

    python實(shí)現(xiàn)猜拳游戲項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)猜拳游戲項(xiàng)目,以excel形式保存信息,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • python遞歸調(diào)用中的坑:打印有值, 返回卻None

    python遞歸調(diào)用中的坑:打印有值, 返回卻None

    這篇文章主要介紹了python遞歸調(diào)用中的坑:打印有值, 返回卻None,本文通過問題分析給出解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論