flask的分頁功能


分頁是個很通用的東西,在flask中,有一個macro的語法,類似於宏,我們可以將通用的東西通過macro寫入單獨的html文件以方便維護,減少代碼量。下面是我的分頁的macro文件render_pagination.html,里面用到的樣式都是bootstrap中的,如下:

{% macro render_pagination(pagination) %}
<div class=pagination>
    {% if pagination.has_prev %}
        <a href="{{ url_for_other_page(pagination.page - 1) }}" class="btn btn-info btn-sm">上一頁</a>
    {% endif %}
    {% for page in pagination.iter_pages() %}
        {% if page %}
            {% if page != pagination.page %}
                <a href="{{ url_for_other_page(page) }}" class="btn btn-info btn-sm">{{ page }}</a>
            {% else %}
                <a href="{{ url_for_other_page(page) }}" class="btn btn-info btn-sm" disabled="disabled">{{ page }}</a>
            {% endif %}
        {% else %}
            <span class=ellipsis>…</span>
        {% endif %}
    {% endfor %}
    {% if pagination.has_next %}
        <a href="{{ url_for_other_page(pagination.page + 1) }}" class="btn btn-info btn-sm">下一頁</a>
    {% endif %}
</div>
{% endmacro %}

上面的代碼分三部分,一是判斷是否有前一頁,有則顯示上一頁按鈕,中間的for循環為頁數的迭代展示,最后一部分是判斷是否有下一頁,有則顯示相應按鈕。
這個macro中涉及到一個url_for_other_page函數,我們定義如下:

def url_for_other_page(page):
    # args = request.view_args.copy()
    args = dict(request.view_args.items() + request.args.to_dict().items())  #如果采用上面那句則換頁時querystring會丟失
    args['page'] = page
    return url_for(request.endpoint, **args)

app.jinja_env.globals['url_for_other_page'] = url_for_other_page

上面的代碼定義了url_for_other_page函數,注意到里面對args的賦值采用了dict,當時我不是這么寫的,當時只用了request.view_args.copy(),結果點擊第二頁的時候,查詢參數就丟失了,很是頭大,后台查詢資料后寫成dict那種方式,查詢參數就不會丟失了。
這個函數定義好后,我們向flask的jinja引擎注冊一個環境變量,然后就可以在模板中使用這個方法了。
上面定義好后,我們只需要在需要引入分頁的頁面添加下面的代碼:

<div style="float: right">
    {% from "macros/render_pagination.html" import render_pagination %}
    {{ render_pagination(pagination) }}
</div>

結束!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM