flask資料分頁paginate的使用(flask學習)
阿新 • • 發佈:2018-12-03
Flask的資料分頁示例
1,首先寫資料獲取的檢視函式,就像這樣:
@app.route('/') @login_required def index(): page=request.args.get('page',1,type=int) pagination=User.query.order_by(User.createTime.desc()).paginate(page,per_page=12,error_out=False) users=pagination.items return render_template('index.html', name=current_user.username,users=users,pagination=pagination)
數從請求的查詢字串(request.args)中獲取,如果沒有明確指定,則預設渲 染第一頁。引數 type=int 保證引數無法轉換成整數時,返回預設值。
為了顯示某頁中的記錄,要把 all() 換成 Flask-SQLAlchemy 提供的 paginate() 方法。頁 數是 paginate() 方法的第一個引數,也是唯一必需的引數。可選引數 per_page 用來指定 每頁顯示的記錄數量;如果沒有指定,則預設顯示 20 個記錄。另一個可選引數為 error_ out,當其設為 True 時(預設值),如果請求的頁數超出了範圍,則會返回 404 錯誤;如果 設為 False,頁數超出範圍時會返回一個空列表。
2,顯示分頁器:
paginate() 方法的返回值是一個 Pagination 類物件,這個類在 Flask-SQLAlchemy 中定義。 這個物件包含很多屬性,用於在模板中生成分頁連結,因此將其作為引數傳入了模板。分頁物件的屬性簡介如表所示。
物件方法:
接下來以 Jinja2 巨集的形式實現的分頁導航,
分頁模板(_macros.html):
{% macro pagination_widget(pagination, endpoint) %} <ul class="pagination"> <li{% if not pagination.has_prev %} class="disabled"{% endif %}> <a href="{% if pagination.has_prev %}{{ url_for(endpoint,page = pagination.page - 1, **kwargs) }} {% else %}#{% endif %}">« </a> </li> {% for p in pagination.iter_pages() %} {% if p %} {% if p == pagination.page %} <li class="active"> <a href="{{ url_for(endpoint, page = p, **kwargs) }}">{{ p }}</a> </li> {% else %} <li> <a href="{{ url_for(endpoint, page = p, **kwargs) }}">{{ p }}</a> </li> {% endif %} {% else %} <li class="disabled"> <a href="#">…</a> </li> {% endif %} {% endfor %} <li{% if not pagination.has_next %} class="disabled"{% endif %}> <a href="{% if pagination.has_next %}{{ url_for(endpoint,page = pagination.page + 1, **kwargs) }}{% else %}#{% endif %}">»</a> </li> </ul> {% endmacro %}
然後就是在需要分頁的地方引入此模板:
{% import "_macros.html" as macros %}
..........其他程式碼省略...........
{%if pagination%}
<div class="pagination">
{{ macros.pagination_widget(pagination, '.index') }}
</div>
{% endif %}
至於分頁的css樣式,自己寫吧,怎麼好看怎麼寫!
分頁就是這麼簡單