flask分页功能:基于flask-sqlalchemy和jinja2

先看源码:

@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():上一页的翻页对象,可以继续调用对象的其他方法和属性

数据库数据:

flask分页功能:基于flask-sqlalchemy和jinja2_第1张图片

 

 flask分页功能:基于flask-sqlalchemy和jinja2_第2张图片

 

 

>>> from watchlist.models import User, Movie
>>> from watchlist import app, db
>>> res.items
[, , , , ]
>>> res = Movie.query.order_by(db.desc(Movie.id)).paginate(1, 10)  
>>> res.items
[, , , , , , , , , ]
>>> res.items[0]

>>> 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
[, , , , , , , , , ]
>>> res.next().next().items
[, , , , , , , , , ]
>>>

 

你可能感兴趣的:(flask分页功能:基于flask-sqlalchemy和jinja2)