新聞中心
關于flask的分頁,大家都知道有一個Flask-SQLAlchemy提供的paginate()方法,這個方法配合bootstrap簡化了分頁連接代碼的生成,但其實關于分頁數(shù)據(jù)的返回才是最重要和最難的,數(shù)據(jù)的生成由多種方法,有原生SQL,有Flask-SQLAlchemy中的原生SQL,有Flask-SQLAlchemy對象數(shù)據(jù)等等。如何結(jié)合數(shù)據(jù)生成方式和分頁組件也算是一個難點吧。

成都網(wǎng)站制作、成都網(wǎng)站建設服務團隊是一支充滿著熱情的團隊,執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標準與要求,同時竭誠為客戶提供服務是我們的理念。創(chuàng)新互聯(lián)把每個網(wǎng)站當做一個產(chǎn)品來開發(fā),精雕細琢,追求一名工匠心中的細致,我們更用心!
不喜歡ORM的同學,尤其如我,更喜歡寫原生SQL多一些,SQL和ORM各有利弊吧。
paginate()方法的返回值是一個Pagination類對象,這個類包含很多的屬性,可以用來在模板中生成分頁的鏈接,因此可以將其作為參數(shù)傳入模板。
Pagination類對象的屬性主要有:
has_next:如果在目前頁后至少還有一頁的話,返回 True。
has_prev:如果在目前頁之前至少還有一頁的話,返回 True。
next_num:下一頁的頁面數(shù)。
prev_num:前一頁的頁面數(shù)。
另外還有如下的可調(diào)用方法:
iter_pages():一個迭代器,返回一個在分頁導航中顯示的頁數(shù)列表。
prev():上一頁的分頁對象。
next():下一頁的分頁對象。
下面是個標準的分頁頁面
Twitter Bootstrap Tutorial - A responsive layout tutorial
| ID | 姓名 | 性別 | 職位 | 聯(lián)系方式 | 操作 |
|---|---|---|---|---|---|
| {{ user.userid }} | {{ user.username }} | {{ user.sex }} | {{ user.postcard }} | {{ user.phone }} |
{{ pagination.links }}
下面是原生SQL和分頁組件的結(jié)合,原生數(shù)據(jù)的輸出需要轉(zhuǎn)換為字典類型。
# 用戶信息主頁面
@app.route('/test/', defaults={'page': 1})
@app.route('/test/')
def list_of_users(page):
page = request.args.get(get_page_parameter(), type=int, default=int(page))
import sqlite3
database = 'C:\\Python\\Pycharm\\supermarket\\test.db'
conn = sqlite3.connect(database)
cur = conn.cursor()
cur.execute("select username,password,personalname,birthday,sex,phone,postcard,address from userinfo ORDER BY userid ASC LIMIT {limit} offset {offset}".format(limit=5, offset = (5 * int(page)-5)))
data = [dict(((cur.description[i][0]), value)
for i, value in enumerate(row)) for row in cur.fetchall()]
print("data=", data)
pagination = Pagination(page=page, total=12,per_page=5)
return render_template('fenye.html', pagedata = data, pagination=pagination)
下面是db.session.execute和分頁組件的組合
# 用戶信息主頁面
@app.route('/test2/', defaults={'page': 1})
@app.route('/test2/')
def list_of_users2(page):
# sql主體語句
sqlpart="select username,password,personalname,birthday,sex,phone,postcard,address from userinfo "
# where主體語句
wherepart = " where 1=1 "
# order by 主體語句
orderbypart=" ORDER BY userid ASC "
# 分頁語句
limitpart=" LIMIT {limit} offset {offset} "
# 每頁記錄行數(shù)暫時內(nèi)定5
limit=5
# 獲取當前頁碼
page = request.args.get(get_page_parameter(), type=int, default=int(page))
# 判斷當前行和偏移量
offset=(5 * int(page)-5)
# 把sql主體語句和where主體語句的SQL合并起來,獲取總頁數(shù)
sqlcount = "select count(*) from ( "+ sqlpart + wherepart+" )"
total = db.session.execute(sqlcount).fetchone()[0]
# 把sql主體語句+where主體語句+order by 主體語句+分頁語句合并起來,獲取當前頁的SQL語句
sql = sqlpart + wherepart + orderbypart + limitpart
sql=sql.format(limit=limit, offset=offset)
# 獲取執(zhí)行結(jié)果
data=db.session.execute(sql).all()
# 獲取分頁代碼
pagination = Pagination(page=page, total=total, per_page=5)
# 將數(shù)據(jù)和分頁代碼傳給頁面
return render_template('fenye.html', pagedata=data, pagination=pagination)
下面是db.session.query和分頁組件的組合
# 用戶信息主頁面
@app.route('/test3/', defaults={'page': 1})
@app.route('/test3/')
def list_of_users3(page):
page = request.args.get(get_page_parameter(), type=int, default=int(page))
pagination=db.session.query(UserInfo.username, UserInfo.password, UserInfo.personalname,UserInfo.birthday,
UserInfo.sex,UserInfo.phone, UserInfo.postcard, UserInfo.address).order_by(UserInfo.userid.desc()).\
paginate(page=page, per_page=5, error_out=True)
items = pagination.items
total = pagination.total
pagination = Pagination(page=page, total=total, per_page=5)
print('pagination=', pagination)
print('pagination.page=',pagination.page) #當前頁數(shù)
print('pagination.pages=',pagination.pages) #總頁數(shù)
print('pagination.total=',pagination.total) #數(shù)據(jù)總條數(shù)
print('pagination.has_prev=',pagination.has_prev) #是否存在上一頁 返回布爾值
print('pagination.has_next=',pagination.has_next) #是否存在下一頁 返回布爾值
return render_template('fenye.html', pagedata=items, pagination=pagination)
下面是數(shù)據(jù)對象和分頁組件的結(jié)合
# -------------------------用戶信息管理------------------------
# 用戶信息主頁面
@app.route('/test4/', defaults={'page': 1})
@app.route('/test4/')
def list_of_users4(page):
page = request.args.get(get_page_parameter(), type=int, default=int(page))
paginate = UserInfo.query.order_by('userid').paginate(page=page, per_page=5, error_out=False)
pagedata = paginate.items # 當前頁數(shù)的記錄列表
total = paginate.total
pagination = Pagination(page=page, total=total, per_page=5)
if pagedata:
return render_template('fenye.html', pagination=pagination, pagedata=pagedata)
else:
return render_template('404.html'), 404
數(shù)據(jù)生成的方式不同,部分數(shù)據(jù)生成方式需要再次轉(zhuǎn)換,pagination的使用方式是一致的,但pagedata是不同的,需要關注。
當前文章:Flask入門之分頁的幾種方式
當前地址:http://m.fisionsoft.com.cn/article/cojhpoh.html


咨詢
建站咨詢
