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)
分页前端:
<ul class="movie-list"> {% for movie in res.items %} <li>{{ movie.title }} - {{ movie.year }} <span class="float-right"> <a class="btn" href="{{ url_for('edit', movie_id=movie.id) }}">Edit</a> <form class="inline-form" method="post" action="{{ url_for('delete', movie_id=movie.id) }}"> <input class="btn" type="submit" name="delete" value="Delete" onclick="return confirm('Are you sure?')"> </form> <a class="imdb" href="https://www.imdb.com/find?q={{ movie.title }}" target="_blank" title="Find this movie on IMDb">IMDb</a> </span> </li> {% endfor %} </ul> <nav class="paginate"> <nav > {% if res.has_prev %} <button onclick="window.location.href='index?page={{ res.prev_num }}'">上一页</button> {% endif %} <button>第{{ res.page }}页</button> {% if res.has_next and res.page < 5 %} <button onclick="window.location.href='index?page={{ res.next_num }}'">下一页</button> {% else %} <button>最后一页</button> {% endif %} <nav class="first-last-page"> <button onclick="window.location.href='index?page=1'">首页</button> <button onclick="window.location.href='index?page={{ res.pages}}'">尾页</button> <button onclick="window.location.href='index'">全部显示</button> </nav> </nav> </nav>
flask-sqlalchemy获取分页数据
在flask-sqlalchemy操作的数据模型的过程中,使用paginate()
方法将结果返回为一个翻页对象,不同于all()
,first()
可以直接获得数据,paginate返回的结果是一个对象,paginate接收三个参数,第一个是从第几页开始(从1开始
),默认是第一页,第二个参数是每页多少条数据,默认是20
,第三个参数处理页数越界
,默认为True
,如果是True则页数小于等于0或者大于最大页数都会报404错误,如果设置为False,页数小于等于0会跳回第一页,页数大于最大值会返回空列表,paginate对象有以下方法
items
: 获取这一页的数据,返回一个列表,每个元素是各字段数据组成的元组has_next
:是否有下一页,True/Falsehas_prev
:是否有上一页,True/Falsetotal
:总数据条数,intpage
:当前页码数,intpages
:总页码数,intnext_num
:下一页页码,intprev_num
:上一页页码,intnext()
:下一页的翻页对象,可以继续调用对象的其他方法和属性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>] >>>
本文来自博客园,作者:Halo3224,转载请注明原文链接:https://www.cnblogs.com/my-blogs-for-everone/p/15641803.html