Skip to main content
 首页 » 编程设计

python之搜索功能(在Flask、SQLAlchemy中查询)

2025年05月04日23daizhj

我是编程和 Flask 的新手,我被这个问题困住了。

我正在尝试在 Web 应用程序中实现搜索功能,该功能将从表单中获取数据并将其与数据库中的值进行比较并列出结果。

这是我目前所拥有的:

View .py

@app.route('/search', methods=['GET', 'POST']) 
def search(): 
    searchForm = searchForm() 
    courses = models.Course.query.order_by(models.Course.name).all() 
    if searchForm.validate_on_submit(): 
        for i in courses: 
            if searchForm.courseName.data == i.name: 
              searchResult = models.Course.filter(Course.name.like('%searchForm.courseName.data%')) 
    return render_template('courselist.html', courses = courses, searchResult = searchResult) 

表单.py

class searchForm(Form): 
    courseName = StringField('Search course', validators=[DataRequired(), Length(max=60)]) 

数据库模型.py

class Course(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(40), unique=True) 
    courseCode = db.Column(db.String(10), unique=True) 
    duration = db.Column(db.Integer) 
    maxStudents = db.Column(db.Integer) 
    startDate = db.Column(db.DateTime) 
    prerequisites = db.Column(db.String(500)) 
    trainerID = db.Column(db.Integer, db.ForeignKey('trainer.id')) 
    venueID = db.Column(db.Integer, db.ForeignKey('venue.id')) 
 
    sessions = db.relationship('Session', backref='course', lazy='dynamic') 
    bookings = db.relationship('Booking', backref='course', lazy='dynamic') 

html文件

{% extends "index.html" %} 
{% block content %} 
<h3>Courses:</h3> 
<ul> 
    {% for course in courses %} 
    <li> 
    <h4><a href="/viewcourse?id={{course.id}}">{{course.name}}</a> 
    <a class="btn btn-success" href="/editcourse?id={{course.id}}">Book</a> 
    <a class="btn btn-info" href="/editcourse?id={{course.id}}">Edit</a> 
    <a class="btn btn-danger" href="/deletecourse?id={{course.id}}">Delete</a></h4> 
    </li> 
    {% endfor %} 
</ul> 
{% endblock %} 

我认为一般逻辑是正确的,但我需要一些帮助来调整它。

请您参考如下方法:

您在 views.py 中的逻辑似乎有点不对劲。您正在从数据库中检索所有 Course 对象并循环访问它们。然后检查类(class)名称是否与搜索输入完全匹配——如果是,则尝试查找匹配的类(class)。我认为这样构造会更好:

@app.route('/search', methods=['GET', 'POST']) 
def search(): 
    searchForm = searchForm() 
    courses = models.Course.query 
 
    if searchForm.validate_on_submit(): 
        courses = courses.filter(models.Course.name.like('%' + searchForm.courseName.data + '%')) 
 
    courses = courses.order_by(models.Course.name).all() 
 
    return render_template('courselist.html', courses = courses)