我的搜索功能无法解析为正确的 render_template,因此无法呈现正确的数据

My search function does not resolve to the correct render_template, and thus does not render the correct data

所以我有一个输入字段,允许我输入一些文本,然后使用该文本在我的数据库中搜索任何类似的项目。

我有一个很简单的表格class

from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired

class searchForm(FlaskForm):
    seachInput= StringField('Search',validators=[DataRequired()])

这是在我的 overview.html 页面上呈现的,如下所示


    <div class="container-right float-right">
        <form class="form-search" method="GET" action="/overview">
            <div class="row row-searchbar justify-content-center">
                <div class="col-4">
                    {{search.seachInput(class_='form-control mr-sm-2')}}
                </div>
                <div class="col-0">
                    <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
                </div>
            </div>
        </form>

现在我想我知道问题出在哪里了,因为 overview.html 有多个路由。一个用于 /overview 本身,另一个用于分页,最后是搜索查询,它似乎总是呈现这个

return render_template("overview.html",pagination=pagination,filter=filter,search=search)

@routes_blueprint.route('/overview',defaults={"page":1})
@routes_blueprint.route('/overview/<int:page>')
@routes_blueprint.route('/overview/<string:search>',methods=['GET'])
def overview(page):
    """ Overview page """
    filter =  checkBox()
    search = searchForm()
    page = page
    per_page = 3
    pagination = Comic.query.paginate(page,per_page,error_out=True)
    if search.validate_on_submit():
        searchQuery = search.seachInput.data
        format = "%{}%".format(searchQuery)
        results = Comic.query.filter(Comic.comicName.like(format)).all()
        return render_template('overview.html',results=results)
    return render_template("overview.html",pagination=pagination,form=filter,search=search)

在我的 overview.html 上,我使用 if 来检查结果变量中是否有任何数据


        <div class="row row-comics justify-content-start">
            {% if results %}
            {% for comics in results %}
            <div class="col-3 col-comics">
                <h2>{{comics.comicName}}</h2>
                <a href="{{url_for('routes.details',id=comics.comicId)}}" class="ClickableImage"><img
                        src="{{comics.comicImage}}"></a>
            </div>
            {% endfor %}

            {% else %}
            {% for comics in pagination.items %}
            <div class="col-3 col-comics">
                <h2>{{comics.comicName}}</h2>
                <a href="{{url_for('routes.details',id=comics.comicId)}}" class="ClickableImage"><img
                        src="{{comics.comicImage}}"></a>
            </div>
            {% endfor %}
            {% endif %}
        </div>

每当我在搜索栏中输入内容时,url 将更改为 /overview?search=yoursearchquery

但数据不会显示在概览页面上。

为了确保更好的概述,我写了一个更简单的例子。它可能会进一步帮助您。如果有不明白的地方,请在评论中留下你的问题。

class Comic(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(255),
        nullable=False, unique=True, index=True)
class SearchForm(FlaskForm):
    qs = StringField('Search')
blueprint = Blueprint('comics', __name__)

@blueprint.route('/search')
def search():
    form = SearchForm(request.form)
    qs = request.args.get('qs')
    items = Comic.query.all() if not qs else \
        Comic.query.filter(Comic.title.like(f'%{qs}%')).all()
    return render_template('search.html', **locals())

@blueprint.route('/<int:id>')
def show(id):
    comic = Comic.query.get_or_404(id)
    return render_template('show.html', **locals())
<form method="GET">
    {{ form.qs() }}
    <button type="submit">Search</button>
</form>

<ul>
{% for item in items %}
    <li><a href="{{ url_for('comics.show', id=item.id) }}"{{ item.title }}</li>
{% endfor %}
</ul>

form.validate_on_submit() 需要有效的 POST 请求。