블로그 시스템을 개발할 때 저자가 게시한 블로그 기사 목록을 표시하거나 저자의 팔로어가 작성한 기사 목록을 표시해야 할 필요가 있습니다. 이 기능을 구현하는 것은 복잡하지 않습니다. 기사가 저장된 데이터베이스에서 지정된 작성자의 기사를 필터링한 다음 표시할 HTML을 렌더링하기만 하면 됩니다.
단, 기사 수가 많지 않은 경우에는 이 방법이 가능할 수 있습니다. 기사 수가 늘어나면 한 페이지에 모든 기사를 표시하는 것이 불가능할 수 있습니다. 이때 기사 목록을 페이징표시해야 하며, 각 페이지에는 지정된 수의 기사만 표시해야 합니다.
이 기능은 어떻게 구현해야 하나요? 우리가 생각할 수 있는 직관적인 방법은 데이터베이스에서 필터링된 기사 목록을 그룹화하고 한 번에 한 그룹의 기사만 표시하는 것입니다. 그런 다음 사용자의 필요에 따라 지정된 그룹의 기사 목록을 표시합니다.
Flask-sqlalchemy는 데이터베이스 관리를 위한 플라스크에 관한 것입니다. 이 기사에서는 직원 디스플레이의 예를 사용합니다.
먼저 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)
위에서 직원 정보를 쿼리한 다음 이를 템플릿으로 프론트 데스크에 전달합니다. (우리는 모듈을 모듈로 나누기 위해 플라스크 블루프린트를 사용했습니다. 위의 내용을 viewfunction으로: Employees.list로 정의한다고 가정합니다.)
참고: paginate는 페이징 방법이고, 첫 번째 매개변수는 페이지 번호, 첫 번째 매개변수는 두 번째 매개변수는 각 페이지에 표시되는 항목 수입니다. 그러나 이렇게 얻은 결과는 목록이 아닙니다. 프런트 데스크에 전달된 값에 .items를 추가해야 합니다. (jinja2 템플릿 사용)
{% for item in Employees.items %}
위와 같이 Jinja2를 사용하여 값을 가져올 때 백그라운드에서 전달된 값 뒤에 .items를 추가해야 합니다.
위의 페이징을 계속하세요. 여기서는 페이징 기능을 구현하는 방법을 정의하기 위해 jinja2 템플릿을 다시 사용해야 합니다. 이 페이지의 이름은 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 %}
위는 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') }}
위는 앞서 정의한 메소드를 호출하는 곳입니다. 첫 번째 매개변수는 백그라운드에서 전달한 값이고 두 번째 매개변수는 백그라운드의 보기 함수입니다.
위 작업을 수행한 후 우리가 달성한 렌더링을 살펴보겠습니다.
위 내용은 모두의 학습에 도움이 되기를 바랍니다.
위 내용은 플라스크 sqlalchemy를 사용하여 페이징을 구현하는 Python에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!