分页显示

创建flask项目

app.py

from models import User
from flask import render_template
from base import app

# http://www.csdn.net/list/
# http://www.csdn.net/list/1/
# http://www.csdn.net/list/2/

@app.route('/list/')
@app.route('/list/<int:page>/')
def list(page=1):
    # 返回的是 Pagination对象
    userPageObj = User.query.paginate(page=page, per_page=app.config['PER_PAGE'])
    return render_template('list.html',
                           userPageObj=userPageObj
                           )


if __name__ == '__main__':
    app.run(port=5005)

base.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
import pymysql

pymysql.install_as_MySQLdb()
app = Flask(__name__)

# 将配置信息独立成一个文件, 便于将来修改;
app.config.from_pyfile('config.py')
db = SQLAlchemy(app)
bt = Bootstrap(app)

config.py

SQLALCHEMY_DATABASE_URI = 'mysql://root:westos@localhost/UserTest'
SQLALCHEMY_TRACK_MODIFICATIONS = True
PER_PAGE = 10

models.py

from base import db
from datetime import datetime


### 用户和角色是什么关系?
#    - 一对一
#    - 一对多: 角色是一, 用户是多, 外键写在多的一端
#    - 多对多
class Role(db.Model):
    __tablename__ = "用户角色"
    # id号递增autoincrement=True
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(20))
    # 反向引用, Role表中有属性users, User类中有role这个属性;
    users = db.relationship('User', backref='role')

    def __repr__(self):
        return "<Role %s>" % (self.name)


class User(db.Model):
    __tablename__ = "网站用户"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(30), unique=True, index=True, nullable=False)  # unique=True用户名不能重复
    password = db.Column(db.String(20), nullable=False)
    email = db.Column(db.String(20), unique=True, index=True)
    # 设置默认值, 位当前用户的创建时间;
    add_time = db.Column(db.DateTime, default=datetime.now())
    #### 重要的: 用户角色id不能随便设置, 需要从Role中查询, (外键关联)
    role_id = db.Column(db.Integer, db.ForeignKey('用户角色.id'))

    # 定义了 __repr()__ 方法,返回一个具有可读性的字符串表示模型,可在调试和测试时使用。
    def __repr__(self):
        return "<User %s>" % (self.username)

template/list.html

{% extends 'bootstrap/base.html' %}

{% block title %}
    用户显示
{% endblock %}

{% block content %}
    <div class="container">
        <div class="col-lg-8 col-lg-offset-2">
            <div class="page-header">
                <h1>用户信息</h1>
            </div>


            <table class="table table-hover">
                <tr>
                    <th>编号</th>
                    <th>姓名</th>
                    <th>邮箱</th>
                    <th>创建时间</th>
                    <th>用户角色</th>
                </tr>

                {% for user in userPageObj.items %}
                    <tr>
                        <th>{{ user.id }}</th>
                        <th>{{ user.username }}</th>
                        <th>{{ user.email }}</th>
                        <th>{{ user.add_time }}</th>
                        <th>{{ user.role.name }}</th>

                    </tr>
                {% endfor %}
            </table>


            <nav aria-label="Page navigation">
                <ul class="pagination">
                    {#
1. 上一页的显示url获取
    /list/2/ ===== url_for('list', userPageObj.prev_num)

2. 上一页信息逻辑判断
    1). 判断是否有上一页信息;
    2). 如果有, 创建链接;
    3). 如果没有, 该链接设为不可点击的链接

3. 上一页显示使用的类属性和方法:
    1). dataObj.has_prev:
        判断用户是否有上一页?
        如果有,返回True; 如果没有,返回False;

    2).dataObj.prev_num:
        获取上一页的页数编号;
#}
                    {% if userPageObj.has_prev %}
                        <li>

                            <a href="{{ url_for('list', page=userPageObj.prev_num) }}" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                            </a>
                        </li>
                    {% else %}
                        <li class="disabled">
                            <a href="#" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                            </a>
                        </li>

                    {% endif %}


                    {#

详细页的显示
依次创建每个分页表框:
    1). 是否为none, 设置类名为diabled;
    2). 是否为当前页, 设置类名为active;
    3).其他,正常设置;
#}

                    {% for page in userPageObj.iter_pages() %}
                        {% if page is none %}
                            <li class="disabled"><a href="#">......</a></li>
                        {% elif page == userPageObj.page %}

                            <li class="active"><a href="{{ url_for('list', page=page) }}">{{ page }}</a></li>
                        {% else %}
                            <li><a href="{{ url_for('list', page=page) }}">{{ page }}</a></li>
                        {% endif %}
                    {% endfor %}


                    {#
1.下一页信息判断逻辑
    1). 判断是否有下一页信息;
    2). 如果有, 创建链接;
    3). 如果没有, 该链接设为不可点击的链接

2. 使用的方法:
    1). dataObj.has_next:
        判断用户是否有下一页?
        如果有,返回True; 如果没有,返回False;
    2).dataObj.next_num: 获取下一页的页数编号;
#}
                    {% if userPageObj.has_next %}
                        <li>
                            <a href="{{ url_for('list', page=userPageObj.next_num) }}" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                            </a>
                        </li>
                    {% else %}
                        <li class="disabled">
                            <a href="#" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                            </a>
                        </li>
                    {% endif %}

                </ul>
            </nav>
        </div>

    </div>
{% endblock %}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值