17flask分页
Posted two-peanuts
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17flask分页相关的知识,希望对你有一定的参考价值。
一,flask_sqlachemy的使用
如果想要展示出来的页面是分页显示,则首先需要知道每页应该分多少个条目,然后通过数据库去查找对应的条数,同时也需要和分页所需的“paginate”结合使用。
先贴代码:
1 @app.route(‘/‘) 2 def index(): 3 # 原始代码 4 # context = 5 # ‘questions‘:Question.query.order_by(‘create_time‘).all() #注意all() 6 # 7 # # print(context) 8 # return render_template(‘index.html‘,**context) #**的使用 9 # print(request.args.get(‘page‘)) 10 11 #分页代码 12 # print(request.args.get(‘page‘,1)) 13 page = int(request.args.get(‘page‘, 1)) 14 per_page = int(request.args.get(‘per_page‘, 3)) 15 # 上面两行别丢了,不能用下面的下,不然不能知道当前页了。 16 #page = 1 17 #per_page = 3 18 19 paginate = Question.query.order_by(db.desc(Question.create_time)).paginate(page, per_page, error_out=False) 20 #这行代码首先根据“db.desc(Question.create_time)“按照创建时间拍个序号, 21 #然后“.paginate(page, per_page, error_out=False)”就成,没啥特殊操作。 22 questions = paginate.items 23 # 将项目与paginate对应 24 25 question_max_id = Question.query.order_by(db.desc(Question.id)).first().id 26 27 context = 28 ‘paginate‘: paginate, 29 ‘questions‘: questions, 30 ‘question_max_id‘: question_max_id 31 #这里我加入了一个最大序号,是为了将最新的条目加“new”标记。 32 33 34 return render_template(‘index.html‘, **context) # **的使用。
原始代码是没有分页的情况。
先看看分页代码中的paginate的用法:
paginate(page, per_page, error_out=True)
page 当前页数
per_page 每页显示的条数
error_out 是否打印错误信息,Flase表页码超出后返回空,否则返回404.
二,jinja2显示
先贴代码
1 % extends ‘base.html‘ % 2 % block title %首页% endblock % 3 4 % block head % 5 <meta charset="UTF-8"> 6 <link rel="stylesheet" href=" url_for(‘static‘,filename = "css/index.css") "> 7 % endblock % 8 9 % block main % 10 <ul> 11 % for question in questions % 12 13 <li> 14 <div class="question-list-group"> 15 <img src=" url_for(‘static‘,filename = "images/dajun1.png")" alt="" class="avatar"> 16 </div> 17 18 <div class="question-group"> 19 20 <p class="question-title"> 21 # <a href=" url_for(‘detail‘,question_id = question.id) "> question.title </a># 22 # 如果当前的问题id大于==id,则给它一个new标签,否则就按照常规输出# 23 % if question.id == question_max_id % 24 # <h6> question.title <span class="label label-default">New</span></h6># 25 <a href=" url_for(‘detail‘,question_id = question.id) "> question.title </a> <span class="label label-default">New</span> 26 % else % 27 <a href=" url_for(‘detail‘,question_id = question.id) "> question.title </a> 28 % endif % 29 30 # #这里注意下带其他参数的question_id的用法# 31 </p> 32 33 <p class="question-content" > 34 # 这里的使得把形如“<p> 打撒</p><p> </p>”这样的文本按照样式显示出来。# 35 question.content|safe 36 </p> 37 38 <div class="question-info"> 39 <span class="question-author"> 40 <a href=" url_for(‘other_user_info‘,anwser_name =question.author.username) "> question.author.username </a> 41 </span> 42 43 <span class="question-time"> 44 question.create_time 45 </span> 46 </div> 47 48 </div> 49 </li> 50 51 % endfor % 52 53 # 当前页数: paginate.page # 54 # 总页数: paginate.pages # 55 # 一共有 paginate.total 条数据# 56 # <br># 57 58 # % if paginate.has_prev %# 59 # <a href="?page= paginate.prev_num ">上一页</a># 60 # % endif %# 61 # 页码:# 62 ## 63 # % for i in paginate.iter_pages() %# 64 # <a href="?page= i "> i </a># 65 # % endfor %# 66 ## 67 # % if paginate.has_next %# 68 # <a href="?page= paginate.next_num ">下一页</a># 69 # % endif %# 70 # </ul># 71 72 73 #下面是只有前后页的情况# 74 #<nav aria-label="..."># 75 # <ul class="pager"># 76 # <li class="previous"><a href="?page= paginate.prev_num "><span aria-hidden="true">←</span> 上一页</a></li># 77 # % if paginate.page ==1 %# 78 # <li class="previous"><a href="#"><span aria-hidden="true">←</span> 上一页</a></li># 79 # % else %# 80 # <li class="previous"><a href="?page= paginate.prev_num "><span aria-hidden="true">←</span> 上一页</a></li># 81 # % endif %# 82 # % if paginate.page >= paginate.pages %# 83 # <li class="next"><a href=#">下一页 <span aria-hidden="true">→</span></a></li># 84 # % else %# 85 # <li class="next"><a href="?page= paginate.next_num ">下一页 <span aria-hidden="true">→</span></a></li># 86 # % endif %# 87 # </ul># 88 #</nav># 89 90 #下面是直接点每一页 加 前后页的情况# 91 <nav aria-label="..."> 92 <ul class="pagination"> 93 # 当前页面为第一页,则把前翻disable# 94 % if paginate.page == 1 % 95 <li class="disable"> 96 <span> 97 <span aria-hidden="true">«</span> 98 </span> 99 </li> 100 % else % 101 <li class="active"> 102 <span> 103 <span aria-hidden="true">«</span> 104 </span> 105 </li> 106 % endif % 107 108 #要用“paginate.iter_pages()”,这里不能用“paginate.pages”(总页数),不然会返回“TypeError: ‘int‘ object is not iterable”# 109 % for i in paginate.iter_pages() % 110 <li class="active"> 111 <a href="?page= i "> i </a> 112 </li> 113 % endfor % 114 115 # 当前页面为最后一页,则把前翻disable# 116 % if paginate.page == paginate.pages % 117 <li class="disable"> 118 <span> 119 <span aria-hidden="true">»</span> 120 </span> 121 </li> 122 % else % 123 <li class="active"> 124 <span> 125 <span aria-hidden="true">»</span> 126 </span> 127 </li> 128 % endif % 129 130 </ul> 131 132 </nav> 133 134 <span class="label label-success"> 当前页数: paginate.page </span> 135 <span class="label label-warning">总页数: paginate.pages </span> 136 <span class="label label-danger">一共有 paginate.total 条数据</span> 137 # (paginate.page /paginate.pages)*100# 138 <br> 139 <div class="progress"> 140 <div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="45" aria-valuemin="0" aria-valuemax="100" style="width: (paginate.page /paginate.pages)*100%"> 141 <span class="sr-only">45% Complete</span> 142 </div> 143 </div> 144 145 # 总页数: paginate.pages # 146 # 一共有 paginate.total 条数据# 147 148 149 % endblock %
行1:引用模板。
行9--行149是block块。
行10--51显示一中的行29内的内容。
行22--28,把最新的条目加“new”标记。
行73的代码能用,是只有前页和后页的情况。
行93--106当前页面为1,则前翻disable。行116同。
注意:行109中是“for i in paginate.iter_pages()”而非“paginate.pages”,不然会显示“TypeError: ‘int‘ object is not iterable”。
行140是翻页进度条,这是据下载条改的,bootstrap都有。
以上是关于17flask分页的主要内容,如果未能解决你的问题,请参考以下文章