如何在烧瓶中进行这个复杂的搜索查询?
How to do this complex search query in flask?
我正在尝试实现一个 'advanced search',但为了这个问题,我会使其更简单一些。
目前的运作方式:
@app.route('/advanced_search', methods=['GET', 'POST'])
def advanced_search():
form = AdvancedProductSearch() # this is a SelectMultipleField
countries = ['Canada', 'France', 'Mexico', 'Nigeria']
form.categories.choices = [(c,c) for c in countries]
if form.validate_on_submit():
countrydata = form.countries.data
res = models.Product.query.filter(models.Product.country.in_(countrydata)).all()
# Now I have my search results, what do I do with them?
return render_template('advanced_search.html', title='Advanced Search', form=form)
我的计划是必须有另一个视图:advanced_search_results
,它应该用于呈现结果,但我不知道它应该如何工作。
@app.route('/advanced_search_results', methods=['GET', 'POST'])
def advanced_search_results(query):
#what to do?
return render_template('advanced_search_results.html', title='Search Results')
我可以想到两种处理方式:
1) 以某种方式将 res 中的所有数据行传递给 advanced_search_results()
视图,但我不知道该怎么做。
2) 使用重定向将所需的搜索查询传递给 advanced_search_results()
并在那里进行数据库搜索。我也不知道该怎么做。
简单return必要的观点:
res = models.Product.query.filter(models.Product.country.in_(countrydata)).all()
# Now I have my search results, let's send them back
return render_template('advanced_search_results.html', title='Results',
results=res)
然后,在您的视图中,您可以像对待任何其他模型列表一样遍历结果:
{% for result in results %}
{{ result.name }}<br>
{{ result.country }}<br>
<hr noshade>
{% endfor %}
或者,如果您想将其托管在另一个 URL,只需将 advanced-search
页面上表单的 action
更改为指向 advanced-search-results
:
<form action="/advanced_search_results" method="post">
{# etc ... #}
</form>
然后您可以验证搜索并显示结果或使用错误消息重定向用户:
@app.route('/advanced_search_results', methods=['POST'])
def advanced_search_results():
form = AdvancedProductSearch()
countries = ['Canada', 'France', 'Mexico', 'Nigeria']
form.categories.choices = [(c,c) for c in countries]
if not form.validate_on_submit():
flash("There were errors with your submission")
return redirect(url_for('advanced_search'))
countrydata = form.countries.data
res = models.Product.query.filter(models.Product.country.in_(countrydata)).all()
return render_template('advanced_search_results.html',
title='Search Results',
results=res)
这使您的 advanced_search
方法更简单:
@app.route('/advanced_search', methods=['GET'])
def advanced_search():
form = AdvancedProductSearch() # this is a SelectMultipleField
countries = ['Canada', 'France', 'Mexico', 'Nigeria']
form.categories.choices = [(c,c) for c in countries]
return render_template('advanced_search.html', title='Advanced Search', form=form)
我正在尝试实现一个 'advanced search',但为了这个问题,我会使其更简单一些。
目前的运作方式:
@app.route('/advanced_search', methods=['GET', 'POST'])
def advanced_search():
form = AdvancedProductSearch() # this is a SelectMultipleField
countries = ['Canada', 'France', 'Mexico', 'Nigeria']
form.categories.choices = [(c,c) for c in countries]
if form.validate_on_submit():
countrydata = form.countries.data
res = models.Product.query.filter(models.Product.country.in_(countrydata)).all()
# Now I have my search results, what do I do with them?
return render_template('advanced_search.html', title='Advanced Search', form=form)
我的计划是必须有另一个视图:advanced_search_results
,它应该用于呈现结果,但我不知道它应该如何工作。
@app.route('/advanced_search_results', methods=['GET', 'POST'])
def advanced_search_results(query):
#what to do?
return render_template('advanced_search_results.html', title='Search Results')
我可以想到两种处理方式:
1) 以某种方式将 res 中的所有数据行传递给 advanced_search_results()
视图,但我不知道该怎么做。
2) 使用重定向将所需的搜索查询传递给 advanced_search_results()
并在那里进行数据库搜索。我也不知道该怎么做。
简单return必要的观点:
res = models.Product.query.filter(models.Product.country.in_(countrydata)).all()
# Now I have my search results, let's send them back
return render_template('advanced_search_results.html', title='Results',
results=res)
然后,在您的视图中,您可以像对待任何其他模型列表一样遍历结果:
{% for result in results %}
{{ result.name }}<br>
{{ result.country }}<br>
<hr noshade>
{% endfor %}
或者,如果您想将其托管在另一个 URL,只需将 advanced-search
页面上表单的 action
更改为指向 advanced-search-results
:
<form action="/advanced_search_results" method="post">
{# etc ... #}
</form>
然后您可以验证搜索并显示结果或使用错误消息重定向用户:
@app.route('/advanced_search_results', methods=['POST'])
def advanced_search_results():
form = AdvancedProductSearch()
countries = ['Canada', 'France', 'Mexico', 'Nigeria']
form.categories.choices = [(c,c) for c in countries]
if not form.validate_on_submit():
flash("There were errors with your submission")
return redirect(url_for('advanced_search'))
countrydata = form.countries.data
res = models.Product.query.filter(models.Product.country.in_(countrydata)).all()
return render_template('advanced_search_results.html',
title='Search Results',
results=res)
这使您的 advanced_search
方法更简单:
@app.route('/advanced_search', methods=['GET'])
def advanced_search():
form = AdvancedProductSearch() # this is a SelectMultipleField
countries = ['Canada', 'France', 'Mexico', 'Nigeria']
form.categories.choices = [(c,c) for c in countries]
return render_template('advanced_search.html', title='Advanced Search', form=form)