学习Flask之分页插件flask_bootstrap

2023-11-03

这次分页功能,主要是依靠 Flask-Bootstrap

首先也是下载flask_bootstrap

pip install flask_bootstrap

安装完后可以观察里面的文件夹
在这里插入图片描述
里面其实还有nav(导航),form(表单),pagination(分页),table(表格),还有一些常用的模板代码,这次分页要使用pagination.html,可以打开看一下

{#  This file was part of Flask-Bootstrap and was modified under the terms of
 its BSD License. Copyright (c) 2013, Marc Brinkmann. All rights reserved. #}

{% macro render_pager(pagination,
                      fragment='',
                      prev=('<span aria-hidden="true">&larr;</span> Previous')|safe,
                      next=('Next <span aria-hidden="true">&rarr;</span>')|safe,
                      align='') -%}
    <nav aria-label="Page navigation">
        <ul class="pagination {% if align == 'center' %}justify-content-center{% elif align == 'right' %}justify-content-end{% endif %}">
            <li class="page-item {% if not pagination.has_prev %}disabled{% endif %}">
                <a class="page-link"
                   href="{{ url_for(request.endpoint, page=pagination.prev_num, **kwargs) + fragment if pagination.has_prev else '#' }}">
                    {{ prev }}
                </a>
            </li>
            <li class="page-item {% if not pagination.has_next %}disabled{% endif %}">
                <a class="page-link"
                   href="{{ url_for(request.endpoint, page=pagination.next_num, **kwargs) + fragment if pagination.has_next else '#' }}">
                    {{ next }}
                </a>
            </li>
        </ul>
    </nav>
{%- endmacro %}

{% macro _arg_url_for(endpoint, base) %}
    {# calls url_for() with a given endpoint and **base as the parameters,
   additionally passing on all keyword_arguments (may overwrite existing ones)
 #}
    {%- with kargs = base.copy() -%}
        {%- do kargs.update(kwargs) -%}
        {{ url_for(endpoint, **kargs) }}
    {%- endwith %}
{%- endmacro %}

{% macro render_pagination(pagination,
                           endpoint=None,
                           prev=('&laquo;')|safe,
                           next=('&raquo;')|safe,
                           size=None,
                           ellipses='…',
                           args={},
                           fragment='',
                           align=''
                           )-%}
    {% if fragment != '' and not fragment.startswith('#') %}{% set fragment = '#' + fragment %}{% endif %}
    {% with url_args = {} %}
        {%- do url_args.update(request.view_args if not endpoint else {}),
       url_args.update(request.args if not endpoint else {}),
       url_args.update(args) -%}
        {% with endpoint = endpoint or request.endpoint %}
            <nav aria-label="Page navigation">
                <ul class="pagination{% if size %} pagination-{{ size }}{% endif %} {% if align == 'center' %}justify-content-center{% elif align == 'right' %}justify-content-end{% endif %}"{{ kwargs|xmlattr }}>
                    {# prev and next are only show if a symbol has been passed. #}
                    {% if prev != None -%}
                        <li class="page-item {% if not pagination.has_prev %}disabled{% endif %}">
                            <a class="page-link" href="{{ _arg_url_for(endpoint, url_args, page=pagination.prev_num) if pagination.has_prev else '#' }}{{ fragment }}">{{ prev }}</a>
                        </li>
                    {%- endif -%}

                    {%- for page in pagination.iter_pages() %}
                        {% if page %}
                            {% if page != pagination.page %}
                                <li class="page-item">
                                    <a class="page-link" href="{{ _arg_url_for(endpoint, url_args, page=page) }}{{ fragment }}">{{ page }}</a>
                                </li>
                            {% else %}
                                <li class="page-item active">
                                    <a class="page-link" href="#">{{ page }} <span class="sr-only">(current)</span></a>
                                </li>
                            {% endif %}
                        {% elif ellipses != None %}
                            <li class="page-item disabled"><a class="page-link" href="#">{{ ellipses }}</a></li>
                        {% endif %}
                    {%- endfor %}

                    {% if next != None -%}
                        <li class="page-item {% if not pagination.has_next %}disabled{% endif %}">
                            <a class="page-link" href="{{ _arg_url_for(endpoint, url_args, page=pagination.next_num) if pagination.has_next else '#' }}{{ fragment }}">{{ next }}</a>
                        </li>
                    {%- endif -%}
                </ul>
            </nav>
        {% endwith %}
    {% endwith %}
{% endmacro %}

可以看到里面有三个 {% macro %},render_pager() _arg_url_for() render_pagination()
(简单解释一下这个macro ,可以当作是一个模板方法,将公共的html 封装成一个方法,然后直接调用,如果是PHP 的框架,一般都是写在一个php 的公共的方法里面的,现在写在模板Html中,用法都差不多)
大概看了一下这三个macro,
render_pager()是个分页,但是只会显示"上一页",“下一页”,
_arg_url_for()是个路径连接的方法吧
render_pagination() 也是个分页,不过会详细显示

好了,现在正式开始

在extendsions.py 仲调用

from flask_bootstrap import Bootstrap
......
bootstrap = Bootstrap()

在__init__.py 初始化

bootstrap.init_app(app)

在数据库查找中,利用 paginate

from epay.config import POST_PER_PAGE #每页显示的行数

def index():
    page = request.args.get('page', 1, type=int)
    pagination = Order.query.order_by(Order.created_at.desc()).paginate(page, per_page=POST_PER_PAGE)
    posts = pagination.items
    return render_template('admin/order/index.html',pagination=pagination, posts=posts)

模板显示:

{% extends 'admin/base.html' %}
{% from 'bootstrap/pagination.html' import render_pagination %}

{% block content %}
<div class="container-fluid">
    <div class="row column_title">
       <div class="col-md-12">
          <div class="page_title">
             <h2>Invoice <small>( user invoice design )</small></h2>
          </div>
       </div>
    </div>
    <!-- row -->
    <div class="row">
       <!-- invoice section -->
       <div class="col-md-12">
         <div class="white_shd full margin_bottom_30">
            <div class="table_section padding_infor_info">
               <div class="table-responsive-sm">
                  <table class="table">
                     <thead>
                        <tr>
                           <th>#</th>
                           <th>Status</th>
                           <th>Order No</th>
                           <th>Amount</th>
                           <th>Email</th>
                           <th>Phone</th>
                           <th>Create Time</th>
                           <th>Action</th>
                        </tr>
                     </thead>
                     <tbody>
                        {% if posts %}
                        {% for v in posts  %}
                           <tr>
                              <td>{{ v.id }}</td>
                              <td>{{ v.status }}</td>
                              <td>{{ v.order_no }}</td>
                              <td>{{ v.amount }}</td>
                              <td>{{ v.email }}</td>
                              <td>{{ v.phone }}</td>
                              <td>{{ v.created_at }}</td>
                              <td>
                                 <a class="btn font-white btn-primary" href="{{ url_for('admin.order.detail',order_no=v.order_no)}}">
                                    <i class="fa fa-edit"></i>
                                 </a>

                                 <a class="btn font-white btn-danger" href="{{ url_for('admin.order.delete',order_no=v.order_no)}}">
                                    <i class="fa fa-remove"></i>
                                 </a>
                              </td>
                           </tr>
                        {% endfor %}
                        {% endif %}
                     </tbody>
                  </table>
                  <div class="page-footer">{{ render_pagination(pagination) }}</div>
               </div>
            </div>
         </div>
      </div>
    </div>
 </div>
{% endblock content %}

最终的样式是这样:
在这里插入图片描述
PS:如果不喜欢bootstrap 的样式风格,其实可以自己写,自定义一个macro,仿照render_pagination() 重新写一个

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习Flask之分页插件flask_bootstrap 的相关文章

  • 如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?

    我在 Cloud9 中使用 Python AWS CDK 并且我部署简单的 Lambda 函数那应该是发送 API 请求到 Atlassian 的 API当对象上传到 S3 存储桶时 也是由 CDK 创建的 这是我的 CDK 堆栈代码 fr
  • python future 和元组解包

    实现像使用 future 进行元组解包这样的事情的优雅 惯用的方法是什么 我有这样的代码 a b c f x y g a b z h y c 我想将其转换为使用期货 理想情况下我想写一些类似的东西 a b c ex submit f x y
  • 如何在序列化器创建方法中获取 URL Id?

    我有以下网址 url r member P
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • Pandas 中允许重复列

    我将一个大的 CSV 包含股票财务数据 文件分割成更小的块 CSV 文件的格式不同 像 Excel 数据透视表之类的东西 第一列的前几行包含一些标题 公司名称 ID 等在以下列中重复 因为一家公司有多个属性 而不是一家公司只有一栏 在前几行
  • 在Python中调整图像大小

    我有一张尺寸为 288 352 的图像 我想将其大小调整为 160 240 我尝试了以下代码 im imread abc png img im resize 160 240 Image ANTIALIAS 但它给出了一个错误TypeErro
  • 如何解决使用 Spark 从 S3 重新分区大量数据时从内存中逐出缓存的表分区元数据的问题?

    在尝试从 S3 重新分区数据帧时 我收到一个一般错误 Caused by org apache spark SparkException Job aborted due to stage failure Task 33 in stage 1
  • Seaborn Pairplot 图例不显示颜色

    我一直在学习如何在Python中使用seaborn和pairplot 这里的一切似乎都工作正常 但由于某种原因 图例不会显示相关的颜色 我无法找到解决方案 因此如果有人有任何建议 请告诉我 x sns pairplot stats2 hue
  • 将 matplotlib 颜色图集中在特定值上

    我正在使用 matplotlib 颜色图 seismic 绘制绘图 并且希望白色以 0 为中心 当我在不进行任何更改的情况下运行脚本时 白色从 0 下降到 10 我尝试设置 vmin 50 vmax 50 但在这种情况下我完全失去了白色 关
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • 如何在 python 中没有 csv.reader 迭代器的情况下解析单行 csv 字符串?

    我有一个 CSV 文件 需要重新排列和重新编码 我想跑 line line decode windows 1250 encode utf 8 在由 CSV 读取器解析和分割之前的每一行 或者我想自己迭代行 运行重新编码 并仅使用单行解析表单
  • 使用 NumPy 将非均匀数据从文件读取到数组中

    假设我有一个如下所示的文本文件 33 346 1223 10 23 11 23 12 23 13 23 14 23 15 23 16 24 10 24 11 24 12 24 13 24 14 24 15 24 16 25 14 25 15
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • Ubuntu 上的 Python 2.7

    我是 Python 新手 正在 Linux 机器 Ubuntu 10 10 上工作 它正在运行 python 2 6 但我想运行 2 7 因为它有我想使用的功能 有人敦促我不要安装 2 7 并将其设置为我的默认 python 我的问题是 如
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • 限制 django 应用程序模型中的单个记录?

    我想使用模型来保存 django 应用程序的系统设置 因此 我想限制该模型 使其只能有一条记录 极限怎么办 尝试这个 class MyModel models Model onefield models CharField The fiel
  • 使用 Flask/WTForms 和 React 进行 CSRF 保护

    有没有人成功地为使用 React 作为受控组件 提交到 Flask 后端 最好使用 WTForms 的表单实现了 CSRF 保护 我看过很多部分答案 其中一个是关于 Django 的 但找不到任何关于 Flask 的明确答案 我的大问题似乎
  • 字典和数组作为类变量与实例变量

    这是赚取积分的简单方法 请解释以下内容 class C a b 0 c def init self self x def d self k v self x k v self a k v self b v self c append v d
  • 如何读取Python字节码?

    我很难理解 Python 的字节码及其dis module import dis def func x 1 dis dis func 上述代码在解释器中输入时会产生以下输出 0 LOAD CONST 1 1 3 STORE FAST 0 x
  • 列表值的意外更改

    这是我的课 class variable object def init self name name alias parents values table name of the variable self name 这是有问题的函数 f

随机推荐

  • Linux命令操作:用sort和awk命令,进行复杂条件过滤

    原文 https www toutiao com i6968352645211963941 多 浩如烟海 参数之杂 多如繁星 需求引导 用到再学 以使用为目的 适当延伸 是一个最实际最有效的办法 某天 我突然想生成一个文件 记录 dev下的
  • 输入三个坐标,判断三角形,并输出面积和周长。

    include
  • MySQL的索引

    什么是索引 索引是一种特殊的文件 InnoDB数据表上的索引是表空间的一个组成部分 它们包含着对数据表里所有记录的引用指针 索引是一种数据结构 数据库索引 是数据库管理系统中一个排序的数据结构 以协助快速查询 更新数据库表中数据 索引的实现
  • shiro入门详解以及使用方法、shiro认证与shiro授权

    shiro介绍 什么是shiro shiro是Apache的一个开源框架 它将软件系统的安全认证相关的功能抽取出来 实现用户身份认证 权限授权 加密 会话管理等功能 组成了一个通用的安全认证框架 它可以实现如下的功能 1 验证用户 2 对用
  • 字符串的输入输出处理

    1391 字符串的输入输出处理 Time Limit 1 Sec Memory Limit 64 MBSubmit 333 Solved 71 Submit Status BBS Description 字符串的输入输出处理 Input 第
  • 线程安全的单例模式:饿汉模式&懒汉模式

    目录 一 单例模式 二 饿汉模式 1 特点 2 实现关键 3 代码实现 三 懒汉模式 1 特点 2 实现关键 3 代码实现 一 单例模式 单例模式 一种典型的设计模式 应用场景 一个类只能实例化一个对象 向外提供统一访问接口的场景 作用 对
  • C++基本使用--菱形继承(多继承)

    菱形继承 多继承 多继承 菱形继承 虚继承virtual 多继承 include
  • 犀牛高程点建地形gh插件电池组_Grasshopper快速生成地形

    简述 根据CAD高程点及高程信息在Grasshopper中快速生成地形模型 所需文件 CAD地形文件 所需软件 Rhino Grasshopper 插件 Human Weaverbird Meshtools Meshedit 可自行前往Fo
  • 计算机网络学习笔记:第四章

    计算机网络学习笔记 第四章 学习书籍 计算机网络 自顶向下方法 第四章 网络层 数据平面 其他章节请参阅 计算机网络 自顶向下方法 第一章 计算机网络和因特网 计算机网络 自顶向下方法 第二章 应用层 计算机网络 自顶向下方法 第三章 运输
  • 区块链技术加密算法为什么不可篡改

    区块链采用密码学的方法来保证已有数据不可能被篡改 这个是误解最多的部分 因为很多人一提到区块链就只觉得是这个 诚然 这部分很重要 而且确实区块链也因此得名 但这只是区块链的定义的一部分 这个部分的两个核心要点是 1 密码学哈希函数 2 非对
  • SpringBoot关键面试题

    什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置 properties或yml文件 创建独立的spring引用程序 main方法运行 嵌入的Tomcat 无需部署war文件 简化maven
  • 如何使用 scp 将文件夹从远程复制到本地?

    问 如何使用 scp 将文件夹从远程复制到本地主机 我使用 ssh 登录到我的服务器 然后 我想将远程文件夹 foo 复制到本地 home user Desktop 我如何实现这一目标 答1 huntsbot com 高效赚钱 自由工作 s
  • Qt中关于emit和moc_*.cpp的自动生成

    关于Qt中的emit 函数 直接查看emit的定义 define emit 可以发现emit仅仅是个宏定义符号 编译器宏替换后就是个 空白 根本就不会编译它 所以代码里完全可以去掉这个符号 反之也可以在任何代码前加上这个符号 如这行代码em
  • C语言详解——枚举类型

    在程序中 可能需要为某些整数定义一个别名 我们可以利用预处理指令 define来完成这项工作 您的代码可能是 define MON 1 define TUE 2 define WED 3 define THU 4 define FRI 5
  • 说一下反三角函数atan等的角度计算值,弧度制和角度制

    我们平时在进行数学计算是 往往会用到三角函数和反三角函数 最常用的反三角函数大概就是atan了 因为这个相当于给定两点之间直线的夹角了 1 正切函数图像 这时正切函数图像 高中的我们就应该知道 正切函数是周期函数 即同一个值 有很多角度值对
  • html 中shadow DOM 的使用

    什么是shadow DOM An important aspect of web components is encapsulation being able to keep the markup structure style and b
  • antV/g2的使用

    antV g2 特点 以数据驱动 安装 npm instal antv g2 使用 准备一个容器 div div 执行代码 1 引入 import
  • 如何使用C ++以编程方式在Word文档中使用目录?

    目录 TOC 是Word文档的重要组成部分 它提供了文档内容的概述 并允许您快速导航到所需的部分 您可能会遇到需要以编程方式从Word文档中添加 提取 更新或删除目录的情况 为此 本文将教您如何使用C 处理Word文件中的目录 让我们探索以
  • D. Permutation Restoration(优先队列+贪心)

    Problem D Codeforces include
  • 学习Flask之分页插件flask_bootstrap

    这次分页功能 主要是依靠 Flask Bootstrap 首先也是下载flask bootstrap pip install flask bootstrap 安装完后可以观察里面的文件夹 里面其实还有nav 导航 form 表单 pagin