Python利用flask sqlalchemy實現分頁效果

Flask-sqlalchemy是關於flask一個針對數據庫管理的。文中咱們採用一個關於員工顯示例子。

首先,咱們建立SQLALCHEMY對像db。

from flask import Flask, render_template,request
from flask_sqlalchemy import SQLAlchemy
 
app = Flask(__name__,static_url_path='')
app.debug = True
app.secret_key = "faefasdfaf"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./db/personal.db' # app的配置,指定數據庫路徑
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_ECHO'] = True
 
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') }}

上面就是咱們調用咱們以前定義的方法。第一個參數,咱們從後臺傳過來的值,第二個就是後臺的那個視圖函數。

進行了以上操做後,咱們就大功告成了,下面看一下,咱們實現了的效果圖。
相關文章
相關標籤/搜索