flask網頁建設主題四

Steven Wang
6 min readNov 28, 2020

--

pagination分頁內容

正常不會全部加載 會很卡,通常是一部分載入 分次載入

paginate(page=None, per_page=None, error_out=True, max_per_page=None)

直接使用於SQL Alchemy物件的返回tweets
page = tweets.paginate(page=1, per_page=3, error_out=False)/page=1在第一頁, per_page=3每頁三個, error_out=False不要顯示404

page是一個物件,具有以下屬性
has_next :是否还有下一页
has_prev :是否还有上一页
items : 返回当前页的所有内容
next(error_out=False) : 返回下一页的Pagination对象
prev(error_out=False) : 返回上一页的Pagination对象
page : 当前页的页码(从1开始)
pages : 总页数
per_page : 每页显示的数量
prev_num : 上一页页码数
next_num :下一页页码数
query :返回 创建这个Pagination对象的查询对象
total :查询返回的记录总数
iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2)

items取回分頁的內容,傳到index.html

page = tweets.paginate(page=1, per_page=3, error_out=False).items
return render_template(‘index.html’, tweets=page, form=form)

route.py/def index 修改page=2,顯示出第二頁的內容

自動分頁顯示內容

將以上過程改為自動,相方有兩個按鈕 前一頁 / 下一頁

後台要知道現在要看第幾頁的功能,可以透過url加一個參數加一個page
127.0.0.1:5000/index?page=1

page = tweets.paginate(page=page_num, per_page=3, error_out=False).items

成果

改寫
將paginate直接在current_user.own_and_followed_tweets()之後使用
tweets=tweets.items傳出到index.html

透過tweets.next_num/tweets.prev_num取得前後頁號

next_url = url_for('index', page=tweets.next_num)
prev_url = url_for('index', page=tweets.prev_num)

next_url=next_url, prev_url=prev_url傳出到index.html

index.html新增按鈕

成果

按Next Page到內容結束會回到page1與直覺不符合,直覺是最後一下沒有Next Page Button,第一頁沒有Prev Page Button

可以透過pagination方法 has_next / has_prev

router.py

改進 if改成一行
next_url = url_for(‘index’, page=tweets.next_num) if tweets.has_next else None
prev_url = url_for(‘index’, page=tweets.prev_num) if tweets.has_prev else None

index.html

成果

paginate / per_page=3 是寫死的 應該是個變量 一個配置,把他的設定放到config.py

tweets = current_user.own_and_followed_tweets().paginate(page=page_num, per_page=3, error_out=False)

config.py

使用
from flask import current_app / 不能新一個app
per_page=current_app.config[‘TWEET_PER_PAGE’]

進行user.html分頁設置

route.py/ def user

user.html/ 新增Prev Page Button Next Page Button

效果

--

--

Steven Wang
Steven Wang

No responses yet