Flask的數據分頁示例
?
用法:
1,首先寫數據獲取的視圖函數,就像這樣:
# 首頁
@blog_bp.route('/', endpoint='index')
def index():#獲取頁數page = request.args.get('page',1)paginate = Article.query.paginate(page=int(page),per_page=3)# articles = Article.query.all()# uname = request.cookies.get('uname')# print(uname)uname = session.get('uname')return render_template('index.html', paginate=paginate, uname=uname)
?
從請求的查詢字符串(request.args)中獲取,如果沒有明確指定,則默認渲染第一頁。page從get請求拿到的是字符串類型,參數?type=int?保證參數無法轉換成整數時,返回默認值。
為了顯示某頁中的記錄,要把?all()?換成?Flask-SQLAlchemy?提供的?paginate()?方法。頁?數是?paginate()?方法的第一個參數,也是唯一必需的參數。可選參數?per_page?用來指定?每頁顯示的記錄數量;如果沒有指定,則默認顯示?20?個記錄。另一個可選參數為?error_?out,當其設為?True?時(默認值),如果請求的頁數超出了范圍,則會返回?404?錯誤;如果?設為?False,頁數超出范圍時會返回一個空列表。
2,顯示分頁器:
paginate()?方法的返回值是一個?Pagination?類對象,這個類在?Flask-SQLAlchemy?中定義。?這個對象包含很多屬性,用于在模板中生成分頁鏈接,因此將其作為參數傳入了模板。分頁對象的屬性簡介如表所示。
? ? #paginate 屬性:
? ? # print(paginate.pages) #總共能生成多少頁
? ? # print(paginate.page) #當前頁碼數
? ? # print(paginate.has_next) #True
? ? # print(paginate.has_prev) #Flase
? ? # print(paginate.next_num) #獲取下一頁的頁碼數
? ? # print(paginate.prev_num) #獲取上一頁的頁碼數
? ? # print(paginate.items) #獲當前頁的對象 列表
對象方法:
接下來以?Jinja2?宏的形式實現的分頁導航,
分頁模板運用的bootstrap的分頁視圖(index.html):
<nav aria-label="Page navigation"><ul class="pagination"><li {% if not paginate.has_prev %} class="disabled"{% endif %}><a href="{{url_for('blog.index')}}?page={{paginate.prev_num}}" aria-label="Previous"><span aria-hidden="true">«</span></a></li>{% for num in range(1,paginate.pages+1) %}<li {% if num == paginate.page %} class="active"{% endif %}><a href="{{url_for('blog.index')}}?page={{num}}">{{num}}</a></li>{% endfor %}<li {% if not paginate.has_next %} class="disabled"{% endif %}><a href="{{url_for('blog.index')}}?page={{paginate.next_num}}" aria-label="Next"><span aria-hidden="true">»</span></a></li></ul></nav>
效果: