亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

利用SQLAlchemy和Bootstrap實現數據分頁顯示

2019-11-11 04:18:31
字體:
來源:轉載
供稿:網友

隨著Web業務拓展,數據量會不斷增長,如果在一個頁面上將全部數據一次性顯示出來,服務器和瀏覽器都會受到很大影響,不切合實際。一般的解決方式是采用分頁顯示的辦法。在Flask框架中,可以利用SQLAlchemy實現分頁查詢,結合Bootstrap提供的強大CSS分頁效果,完美地實現分頁導航的效果。

0x01 創建虛擬數據

為了更好地體現顯示分頁效果,我們先在數據模型中虛擬足夠的模擬數據。在Python中,我們可以利用Forgerypy來實現(參見利用ForgeryPy生成虛擬數據)。下面我們直接寫兩個函數來實現實驗數據的生成:

Users.py:

#生成模擬數據@staticmethoddef generate_fake(count=100): from sqlalchemy.exc import IntegrityError from random import seed import forgery_py seed() for i in range(count): u=Users() u.username=forgery_py.internet.user_name(True) u.email=forgery_py.internet.email_address() u.passWord=forgery_py.lorem_ipsum.word() u.confirmed=True u.about_me=forgery_py.lorem_ipsum.sentence() u.realname=forgery_py.name.full_name() u.location=forgery_py.address.city() u.registerTime=forgery_py.date.date(True) db.session.add(u) try: db.session.commit() except IntegrityError: #回滾 db.session.rollback()

Posts.py:

@staticmethoddef generate_fake(c=100): from random import randint,seed import forgery_py from Users import Users seed() count=db.session.query(Users).count() for i in range(c): u=db.session.query(Users).offset(randint(0,count-1)).first() p=Posts(author=u) p.body=forgery_py.lorem_ipsum.sentence() p.timestamp=forgery_py.date.date(True) db.session.add(p) db.session.commit()

0x02 渲染數據

定義支持分頁顯示的路由:

#分頁顯示page=request.args.get('page',1,type=int)pagination=Posts.query.order_by(Posts.timestamp.desc()).paginate( page,per_page=5, error_out=False)posts=pagination.itemsreturn render_template('main/index.html',posts=posts,form=form,pagination=pagination)

通過request.args.get獲取需要顯示的頁碼(type定義為整數,異常默認為1),per_page定義了每頁顯示的記錄的個數。error_out參數如果設置成True,當請求的頁數超過了總的頁數范圍,就會返回一個404錯誤,如果設為False,就會返回一個空列表。這樣修改后,頁面只會顯示有限的記錄數量。

0x03 添加分頁導航

paginate()方法返回了一個Pagination對象。這個類在Flask-SQLAlchemy中定義,包含大量屬性和方法,可以非常方便地生成分頁導航模型。

屬性:

序號 屬性 說明
1 items 當前頁的記錄個數
2 query 分頁的源查詢
3 page 當前的頁數
4 PRev_num 上一頁數
5 next_num 下一頁數
6 has_prev 是否有上一頁
7 has_next 是否有下一頁
8 pages 總的頁數
9 per_page 每頁顯示的記錄條數
10 total 總的記錄條數

方法:

序號 方法 說明
1 iter_pages(left_edge=2,left_current=2,right_current=5,right_age=2) 一個迭代器,返回選中當前頁時顯示的頁數列表。如這個例子中最左邊顯示2個頁數,當前頁的左邊顯示2個頁數,當前頁的右邊顯示5個頁數而當前頁的最右邊顯示2個頁數
2 prev() 上一頁的分頁對象
3 next() 下一頁的分頁對象

結合Bootstrap提供的分頁CSS效果,我們可以實現一個美觀的分頁導航。定義一個macro宏(/templates/_macros.html):

{% macro pagination_widget(pagination, endpoint, fragment='') %}<div class="pagination"> <ul class="pagination"> <li{% if not pagination.has_prev %} class="disabled"{% endif %}> <a href="{% if pagination.has_prev %}{{ url_for(endpoint, page=pagination.prev_num, **kwargs) }}{{ fragment }}{% else %}#{% endif %}"> &laquo; </a> </li> {% for p in pagination.iter_pages() %} {% if p %} {% if p == pagination.page %} <li class="active"> <a href="{{ url_for(endpoint, page = p, **kwargs) }}{{ fragment }}">{{ p }}</a> </li> {% else %} <li> <a href="{{ url_for(endpoint, page = p, **kwargs) }}{{ fragment }}">{{ p }}</a> </li> {% endif %} {% else %} <li class="disabled"><a href="#">&hellip;</a></li> {% endif %} {% endfor %} <li{% if not pagination.has_next %} class="disabled"{% endif %}> <a href="{% if pagination.has_next %}{{ url_for(endpoint, page=pagination.next_num, **kwargs) }}{{ fragment }}{% else %}#{% endif %}"> &raquo; </a> </li></ul></div>{% endmacro %}

可以在視圖這樣就實現了分頁導航的效果:

0x04 功能拓展

我們可以對分頁導航進行拓展(參見Bootstrap學習總結筆記(12)– 基本組件之分頁)。

_macros.html中添加跳轉功能:

{% macro pagination_widget(pagination, endpoint, fragment='') %}<div class="pagination"> <ul class="pagination"> <li{% if not pagination.has_prev %} class="disabled"{% endif %}> <a href="{% if pagination.has_prev %}{{ url_for(endpoint, page=pagination.prev_num, **kwargs) }}{{ fragment }}{% else %}#{% endif %}"> &laquo; </a> </li> {% for p in pagination.iter_pages() %} {% if p %} {% if p == pagination.page %} <li class="active"> <a href="{{ url_for(endpoint, page = p, **kwargs) }}{{ fragment }}">{{ p }}</a> </li> {% else %} <li> <a href="{{ url_for(endpoint, page = p, **kwargs) }}{{ fragment }}">{{ p }}</a> </li> {% endif %} {% else %} <li class="disabled"><a href="#">&hellip;</a></li> {% endif %} {% endfor %} <li{% if not pagination.has_next %} class="disabled"{% endif %}> <a href="{% if pagination.has_next %}{{ url_for(endpoint, page=pagination.next_num, **kwargs) }}{{ fragment }}{% else %}#{% endif %}"> &raquo; </a> </li> <li class="pull-right"> <label for="transfer_page">跳轉到:</label> <input type="text" class="text-info" size="3" id="transfer_page"> <button type="button" class="btn btn-primary btn-sm" id="transfer">Go</button> </li></ul></div>{% endmacro %}

在視圖模板中加入js代碼:

{%block scripts%}{{super()}}<script type="text/javascript"> $(function(){ $('#transfer').click(function(){ var page=$('#transfer_page').val(); window.location.href="{{url_for('main.index')}}"+"?page="+page; }) })</script>

效果如下:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情奇米色| 热99精品只有里视频精品| 在线国产精品视频| 欧美国产日韩中文字幕在线| 亚洲日本成人女熟在线观看| 国产一区二区三区在线免费观看| 尤物九九久久国产精品的分类| 国产在线精品一区免费香蕉| 久久久在线免费观看| 亚洲国产精品yw在线观看| 国产精品天天狠天天看| 日韩电影中文字幕在线观看| 欧美黑人国产人伦爽爽爽| 韩国三级日本三级少妇99| 中文字幕亚洲字幕| 国产精品第2页| 一道本无吗dⅴd在线播放一区| 久久男人资源视频| 亚洲第一页中文字幕| 精品国产拍在线观看| 亚洲第一视频在线观看| 久久手机精品视频| 色噜噜国产精品视频一区二区| 国产精品一区二区女厕厕| 欧美高清一级大片| 日韩国产高清污视频在线观看| 国产精品福利在线观看网址| 九九热99久久久国产盗摄| 91在线|亚洲| 欧美丝袜美女中出在线| 日韩电影网在线| 国产精品久久久av| 中文字幕亚洲第一| 国产亚洲精品一区二555| 日韩av片永久免费网站| 亚洲国产美女精品久久久久∴| 亚洲国产日韩欧美在线动漫| 欧洲永久精品大片ww免费漫画| 欧美最猛性xxxx| 成人激情在线观看| 精品夜色国产国偷在线| 亚洲国产日韩精品在线| 国产成人福利视频| 中文日韩在线视频| 欧美激情国产精品| 国产综合视频在线观看| 欧美成人精品不卡视频在线观看| 欧美激情aaaa| 色av中文字幕一区| 国产精品视频网址| 亚洲亚裔videos黑人hd| 俺也去精品视频在线观看| 中文字幕亚洲欧美日韩高清| 亚洲精品黄网在线观看| 国产精品久久久久一区二区| 欧美猛男性生活免费| 国产精品白丝av嫩草影院| 美女撒尿一区二区三区| 成人免费视频97| 欧美黑人xxxⅹ高潮交| 伊人成人开心激情综合网| 亚洲成人av在线播放| 日韩欧美国产激情| 欧美一区二区大胆人体摄影专业网站| 国内精品视频一区| 久久精品国产一区| 亚洲女人被黑人巨大进入al| 成人性生交大片免费看小说| 日韩免费看的电影电视剧大全| 国产精品日日摸夜夜添夜夜av| 亚洲精品日韩欧美| 精品国产91久久久久久| 91大神在线播放精品| 亚洲老头同性xxxxx| 国产深夜精品福利| 亚洲成avwww人| 日本欧美黄网站| 国内自拍欧美激情| 精品亚洲一区二区三区在线观看| 欧美性69xxxx肥| 欧美一区二粉嫩精品国产一线天| 国内精品久久久久影院优| 91精品国产免费久久久久久| 久久久久久免费精品| 国产精品欧美日韩久久| 中文字幕精品久久久久| 国产视频丨精品|在线观看| 亚洲最大福利视频| 欧美视频裸体精品| 亚洲精品成人网| 日韩电视剧免费观看网站| 亚洲天堂免费视频| 91国内产香蕉| 中文字幕一区二区精品| 国产一区二区黑人欧美xxxx| 欧美性生交xxxxxdddd| 欧美日韩另类视频| 欧美成人激情图片网| 高清欧美电影在线| 91中文在线视频| 亚洲国产天堂网精品网站| 欧美成人激情视频| 成人免费网视频| 久久国产精品首页| 久久精品99无色码中文字幕| 国产日韩欧美中文| 亚洲色图国产精品| 大伊人狠狠躁夜夜躁av一区| 亚洲欧美综合图区| 亚洲成人国产精品| 国产视频999| 国产精品亚洲аv天堂网| 久久久久一本一区二区青青蜜月| 欧美激情亚洲国产| 俺去啦;欧美日韩| 日韩性生活视频| 国产午夜精品一区二区三区| 亚洲伊人第一页| 在线播放国产一区中文字幕剧情欧美| 57pao成人永久免费视频| 亚洲免费精彩视频| 精品久久久中文| 日韩在线视频网| 午夜精品福利在线观看| 少妇精69xxtheporn| 精品中文字幕视频| 欧美亚洲国产日本| 国产成人免费91av在线| 亚洲美女在线视频| 欧美专区中文字幕| 欧美午夜电影在线| 中文字幕精品久久| 亚洲午夜av电影| 欧美黑人极品猛少妇色xxxxx| 在线播放精品一区二区三区| 亚洲天堂网站在线观看视频| 国产97人人超碰caoprom| 91视频国产精品| 欧美日韩高清在线观看| 久久国产一区二区三区| 九九久久综合网站| 午夜精品一区二区三区在线| 日韩视频―中文字幕| 国产剧情日韩欧美| 国产精品久久久久久久天堂| 国产一区二区丝袜高跟鞋图片| 久久久久久中文字幕| 全色精品综合影院| 麻豆成人在线看| 久久在线精品视频| 日韩在线视频线视频免费网站| 中文.日本.精品| 成人xvideos免费视频| 欧美日韩一区二区三区| 国产精品久久久久久婷婷天堂| 亚洲国产欧美一区二区三区久久| 久久人体大胆视频| 国产精品视频精品视频| 久久中文精品视频| 九九久久久久99精品| 88国产精品欧美一区二区三区| 亚洲天堂网在线观看| 亚洲视频自拍偷拍| 欧美视频在线视频|