Maison >développement back-end >Tutoriel Python >Explication détaillée de Python utilisant flask sqlalchemy pour implémenter la pagination
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)
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 '<员工{},{},{},{}>'.format(self.id, self.name, self.salary, self.address)
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('employeelist.html', employees=employees)
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 %}
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!