我的搜索功能无法解析为正确的 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 请求。
所以我有一个输入字段,允许我输入一些文本,然后使用该文本在我的数据库中搜索任何类似的项目。
我有一个很简单的表格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 请求。