flask分頁功能:基於flask-sqlalchemy和jinja2

Halo3224發表於2021-12-04

先看原始碼:

@app.route('/movie', methods=['GET', 'POST'])
@app.route('/home', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
@app.route('/', methods=['GET', 'POST'])
def movie_page():
    # user = User.query.first()
    if request.method == 'POST':  # 判斷是否是 POST 請求
        if not current_user.is_authenticated:  # 如果當前使用者未認證
            flash('未登入無法新增.')
            return redirect(url_for('login'))  # 重定向到主頁
        # 獲取表單資料
        title = request.form.get('title')  # 傳入表單對應輸入欄位的 name 值
        title = "%s" % escape(title)

        year = request.form.get('year')
        year = "%s" % escape(year)
        # 驗證資料
        if not title or not year or len(year) != 4 or len(title) > 60:
            flash('Invalid input.')  # 顯示錯誤提示
            return redirect(url_for('movie_page'))  # 重定向回主頁
        # 儲存表單資料到資料庫
        movie = Movie(title=title, year=year)  # 建立記錄
        db.session.add(movie)  # 新增到資料庫會話
        db.session.commit()  # 提交資料庫會話
        flash('Item created.')  # 顯示成功建立的提示
        return redirect(url_for('movie_page'))  # 重定向回主頁
    movies = Movie.query.order_by(db.desc(Movie.id)).all()

    data = request.args.to_dict()
    page = int(data.get('page', 1))
    res = Movie.query.order_by(db.desc(Movie.id)).paginate(page, POSTS_PER_AGE)
    return render_template('index.html', res=res, movies=movies)

 

flask-sqlalchemy獲取分頁資料

在flask-sqlalchemy操作的資料模型的過程中,使用paginate()方法將結果返回為一個翻頁物件,不同於all()first()可以直接獲得資料,paginate返回的結果是一個物件,paginate接收三個引數,第一個是從第幾頁開始(從1開始),預設是第一頁,第二個引數是每頁多少條資料,預設是20,第三個引數處理頁數越界預設為True,如果是True則頁數小於等於0或者大於最大頁數都會報404錯誤,如果設定為False,頁數小於等於0會跳回第一頁,頁數大於最大值會返回空列表,paginate物件有以下方法

  • items: 獲取這一頁的資料,返回一個列表,每個元素是各欄位資料組成的元組
  • has_next:是否有下一頁,True/False
  • has_prev:是否有上一頁,True/False
  • total:總資料條數,int
  • page:當前頁碼數,int
  • pages:總頁碼數,int
  • next_num:下一頁頁碼,int
  • prev_num:上一頁頁碼,int
  • next():下一頁的翻頁物件,可以繼續呼叫物件的其他方法和屬性
  • prev():上一頁的翻頁物件,可以繼續呼叫物件的其他方法和屬性

資料庫資料:

 

 

 

 

>>> from watchlist.models import User, Movie
>>> from watchlist import app, db
>>> res.items
[<Movie 12>, <Movie 11>, <Movie 10>, <Movie 9>, <Movie 8>]
>>> res = Movie.query.order_by(db.desc(Movie.id)).paginate(1, 10)  
>>> res.items
[<Movie 31>, <Movie 30>, <Movie 29>, <Movie 28>, <Movie 27>, <Movie 26>, <Movie 25>, <Movie 24>, <Movie 23>, <Movie 22>]
>>> res.items[0]
<Movie 31>
>>> res.items[0].title
'速度與激情10'
>>> res.items[0].year
'2022'
>>> res.has_next
True
>>> res.has_prev
False
>>> res.total
31
>>> res.page
1
>>> res.pages
4
>>> res.next_num
2
>>> res.prev_num>>> res.next().items
[<Movie 21>, <Movie 20>, <Movie 19>, <Movie 18>, <Movie 17>, <Movie 16>, <Movie 15>, <Movie 14>, <Movie 13>, <Movie 12>]
>>> res.next().next().items
[<Movie 11>, <Movie 10>, <Movie 9>, <Movie 8>, <Movie 7>, <Movie 6>, <Movie 5>, <Movie 4>, <Movie 3>, <Movie 2>]
>>>

 

相關文章