Explication détaillée de Python utilisant flask sqlalchemy pour implémenter la pagination

零下一度
Libérer: 2017-07-16 11:38:12
original
2342 Les gens l'ont consulté

Lors du développement d'un système de blog, nous avons besoin d'afficher une liste d'articles de blog que l'auteur a publiés, ou d'afficher une liste d'articles rédigés par les abonnés de l'auteur. La mise en œuvre de cette fonction n'est pas compliquée. Il vous suffit de filtrer les articles de l'auteur spécifié dans la base de données où les articles sont stockés, puis de restituer le HTML pour l'affichage.
Cependant, cette méthode peut être réalisable lorsqu'il n'y a pas beaucoup d'articles. Lorsque le nombre d'articles augmente, il sera impossible d'afficher tous les articles sur une seule page. À ce stade, vous devez pagination afficher la liste des articles, et afficher uniquement un nombre spécifié d'articles sur chaque page.
Comment cette fonction doit-elle être implémentée ? Une méthode intuitive à laquelle nous pouvons penser consiste à regrouper la liste des articles filtrés de la base de données et à afficher un seul groupe d'articles à la fois. Affichez ensuite la liste des articles du groupe spécifié en fonction des besoins de l'utilisateur.

Flask-sqlalchemy concerne Flask pour la gestion de bases de données. Dans cet article, nous utilisons un exemple d’affichage des employés.

Tout d'abord, nous créons la base de données d'objet SQLALCHEMY.

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)
Copier après la connexion


Ensuite, nous utilisons db pour créer la table des employés :


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 &#39;<员工{},{},{},{}>&#39;.format(self.id, self.name, self.salary, self.address)
Copier après la connexion


Une fois la table créée, nous pouvons interroger les données de la table.


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(&#39;employeelist.html&#39;, employees=employees)
Copier après la connexion


Ci-dessus, nous interrogeons les informations sur l'employé, puis les transmettons à la réception comme modèle. (Nous avons utilisé le plan du flacon pour diviser le module en modules. Supposons que nous définissions ce qui précède comme vue fonction comme : employe.list)

Remarque : paginate est In la méthode de pagination, le premier paramètre est le numéro de page et le deuxième paramètre est le nombre d'éléments affichés sur chaque page. Cependant, le résultat obtenu de cette manière n'est pas une liste. Vous devez ajouter un .items à la valeur transmise à la réception. Voici un exemple. (En utilisant le modèle jinja2)

{% for item in employes.items %}

Comme indiqué ci-dessus, lorsque vous utilisez Jinja2 pour obtenir la valeur, vous avez besoin à Après la valeur transmise depuis l'arrière-plan, ajoutez .items.

En continuant la pagination ci-dessus, nous devons ici à nouveau utiliser le modèle jinja2 pour définir une méthode pour implémenter la fonction de pagination. Le nom de cette page est : helper.html.


{% macro render_page_data(page_data,page_function) %}
  <p 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>
  </p>
{% endmacro %}
Copier après la connexion


Ce qui précède montre comment nous utilisons la syntaxe jinja2 pour définir une méthode de distribution. Dans cette méthode, nous passons deux paramètres, le premier concerne les données transmises depuis l'arrière-plan et interrogées via la pagination de la base de données. La seconde est la méthode des données que nous interrogeons.

Une note particulière doit être faite ici. Il existe plusieurs méthodes importantes pour la pagination des données :

  • has_next : s'il y en a au moins une. page après la page en cours, renvoie True

  • has_prev : S'il y a au moins une page avant la page en cours, renvoie True

  • next_num : page suivante Nombre de pages

  • prev_num : Nombre de pages sur la page précédente

Après avoir effectué le travail ci-dessus, il y a Il ne reste plus qu'une étape. Nous devons importer la méthode que nous venons de définir via Jinja2 sur notre page de modèle, c'est-à-dire l'importer dans notre Employeelist.html ci-dessus.

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

Après l'importation, nous pouvons l'appeler là où nous en avons besoin.

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

C'est ci-dessus que nous appelons la méthode que nous avons définie précédemment. Le premier paramètre est la valeur que nous avons transmise depuis l'arrière-plan et le second est la fonction d'affichage en arrière-plan.

Après avoir effectué les opérations ci-dessus, nous avons terminé. Jetons un coup d'œil aux rendus que nous avons obtenus.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun, et j'espère également que tout le monde soutiendra Script House.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal