【问题标题】:search function (query in Flask, SQLAlchemy)搜索功能(在 Flask、SQLAlchemy 中查询)
【发布时间】:2017-07-23 14:15:48
【问题描述】:

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

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

这是我目前所拥有的:

views.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)

form.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 %}

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

【问题讨论】:

  • 你能在最后添加 all() 吗?比如models.Course.filter(Course.name.like('%%s%'%searchForm.courseName.data)).all()
  • students = models.Student.query.all() - 他们都遵循相同的结构,我看不出有什么帮助

标签: python sqlite flask sqlalchemy


【解决方案1】:

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

@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)

【讨论】:

    【解决方案2】:

    这是最简单的答案:

    @app.route("/search", methods=['GET'])
    def search():
        query = request.args.get("query") # here query will be the search inputs name
        allVideos = Videos.query.filter(Videos.title.like("%"+query+"%")).all()
        return render_template("search.html", query=query, allVideos=allVideos)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 2014-02-15
      • 2018-10-17
      • 2013-07-24
      • 2016-05-03
      • 1970-01-01
      相关资源
      最近更新 更多