zoukankan      html  css  js  c++  java
  • Python-Flask:利用flask_sqlalchemy实现分页效果

    Flask-sqlalchemy是关于flask一个针对数据库管理的。文中我们采用一个关于员工显示例子。

    首先,我们创建SQLALCHEMY对像db。

     1 from flask import Flask, render_template,request
     2 from flask_sqlalchemy import SQLAlchemy
     5 
     6 app = Flask(__name__,static_url_path='')
     7 app.debug = True
     8 app.secret_key = "faefasdfaf"
     9 app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./db/personal.db'  # app的配置,指定数据库路径
    10 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    11 app.config['SQLALCHEMY_ECHO'] = True  
    12 
    13 db = SQLAlchemy(app)

    然后我们利用db创建员工表:

    
    
    from datetime import datetime

    class
    Employee(db.Model): '''员工''' __tablename__ = 'employee' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) gender = db.Column(db.String) job = db.Column(db.String) birthday = db.Column(db.DateTime) idcard = db.Column(db.String) address = db.Column(db.String) salary = db.Column(db.String) release_time = db.Column(db.DateTime) def __init__(self, name, gender, job, birthday, idcard, address, salary, release_time=None): self.name = name self.gender = gender self.job = job self.birthday = birthday self.idcard = idcard self.address = address self.salary = salary self.release_time = release_time if release_time else datetime.now() def __repr__(self): return '<员工{},{},{},{}>'.format(self.id, self.name, self.salary, self.address)

    表创建好之后,我们可以从表中查询数据了。

    from flask import render_template
    from flask.views import MethodView
    class EmployeeListView(MethodView):  # 获取员工信息
        def get(self,page=1):
            employees = Employee.query.paginate(page,per_page=10)
            return render_template('employeelist.html', employees=employees)

    以上我们通过查询,查询出员工信息,然后传给前台一个模板。(以上我们采用了flask的蓝图进行了分模块,假设我们把上面这个定义为视图函数为:employee.list)

    注:paginate是分页的方法,第一个参数是页码,第二个是每页显示多少条。但是这样得到的结果不是一列表,需要在传到前台的值加一个 .items,下面举例说明。(利用jinja2模板)
     {% for item in employees.items %}

    如上所示,在利用Jinja2去取值时,需要在后台传过来的值后面,加上.items。

    继续上面的分页,

    这里我们要再次利用jinja2模板来定义一个方法,以实现分页的功能,这个页面名字就叫:helper.html。

    {% macro render_page_data(page_data,page_function) %}
    <div class="text-center">
    <ul class="page_data">
    <li><a href="{{ url_for(page_function,page = 1) }}">首页</a></li>
    {% if page_data.has_prev %}
    <li><a href="{{ url_for(page_function,page = page_data.prev_num) }}">«</a></li>
    {% endif %}
    {% for page in page_data.iter_pages() %}
    {% if page %}
    {% if page !=page_data.page %}
    <li><a href="{{ url_for(page_function,page = page) }}">{{ page }}</a></li>
    {% else %}
    <li class="active"><a href="#">{{ page }}</a></li>
    {% endif %}
    {% endif %}
    {% endfor %}
    {% if page_data.has_next %}
    <li><a href="{{ url_for(page_function,page = page_data.next_num) }}">»</a></li>
    {% endif %}
    <li><a href="{{ url_for(page_function,page = page_data.pages) }}">末页</a></li>
    </ul>
    </div>
    {% endmacro %}
    以上是我们利用jinja2的语法定义了一个分布的方法,这个方法,我们传了二个参数,第一个是后台传过来通过db分页查询出来的数据。第二个是我们查询的数据的方法。
    这里需要特别说明一下,分页的数据有几个重要的方法:
    • has_next:如果在目前页后至少还有一页的话,返回 True
    • has_prev:如果在目前页之前至少还有一页的话,返回 True
    • next_num:下一页的页面数
    • prev_num:前一页的页面数

    通过上面的工作之后,最后就只差一步了,我们需要在我们的模板页通过Jinja2导入我们刚刚定义的方法,也就是在上面我们的employeelist.html中导入。

    {% import 'helper.html' as helper %}

    导入之后,我们就可以在我们需要的地方调用就可以了。

    {{ helper.render_pagination(employees,'employee.list') }}

    上面就是我们调用我们之前定义的方法。第一个参数,我们从后台传过来的值,第二个就是后台的那个视图函数。

    进行了以上操作后,我们就大功告成了,下面看一下,我们实现了的效果图。



  • 相关阅读:
    HDU 5492 Find a path
    codeforce gym 100548H The Problem to Make You Happy
    Topcoder SRM 144 Lottery
    codeforce 165E Compatible Numbers
    codeforce gym 100307H Hack Protection
    区间DP总结
    UESTC 1321 柱爷的恋爱 (区间DP)
    HDU 4283 You Are the One (区间DP)
    HDU 2476 String painter (区间DP)
    UESTC 426 Food Delivery (区间DP)
  • 原文地址:https://www.cnblogs.com/Alin-2016/p/7170243.html
Copyright © 2011-2022 走看看