Flask - 在路由之间传递选定字段以生成查询并显示结果

Flask - Passing selected field between routes to generate query and show results

我正在构建一个应用程序,它将在我的 home/index 页面上显示 year_from 和 year_to 下拉菜单,并在另一个页面上 return 匹配结果。

所需流量: 用户会看到 2 个带有预填充数据的下拉列表。用户 select 在索引路线上的一年范围内。然后,该年份范围将查询数据库和 return 列表路径上年份范围之间的所有结果。

我能够达到这样的程度,即我可以查询我的数据库的年份和年份,并将它们显示在 flask-wtf 查询 select 字段中。

问题: 我无法从索引页面中获取用户 selected 字段并使用它们生成查询和 return 我的列表页面中的结果。未传递用户 selected 字段。

我错过了什么?

路线

from flask import render_template, flash, redirect, url_for, request
from app import app
from app.models import Listingyear
from app.forms import YearForm

@app.route('/', methods=['GET', 'POST'])
@app.route('/index')
def index():
    form = YearForm()
    if form.validate_on_submit():
        year_from = request.form.get(year_from_select)
        year_to = request.form.get(year_to_select)
        return redirect (url_for('listing'))
    return render_template('index.html', form=form) 

@app.route('/listing', methods=['GET', 'POST'])
def listing():
    return render_template('listing.html')

表格

from flask_wtf import FlaskForm
from wtforms import SubmitField, SelectField
from wtforms.validators import DataRequired
from wtforms_alchemy.fields import QuerySelectField
from app.models import Listingyear

def Listingyear_from_query(): #for query_factory, sort year ascending, will update later
    return Listingyear.query

def Listingyear_to_query(): #for query_factory, sort year descending, will update later
    return Listingyear.query

class YearForm(FlaskForm):
    year_from_select = QuerySelectField(query_factory=Listingyear_from_query, allow_blank=False, get_label='year', validators=[DataRequired()])
    year_to_select = QuerySelectField(query_factory=Listingyear_to_query, allow_blank=False, get_label='year', validators=[DataRequired()])
    submit = SubmitField('Search')

索引

{% extends "base.html" %}

{% block content %}
<h1>My App</h1>
<form action="{{ url_for('listing') }}" method="post">
    {{ form.hidden_tag() }}
    {{ form.year_from_select }}
    {{ form.year_to_select }}
    <p>{{ form.submit() }}</p>
</form>
{% endblock %}

这解决了问题,因为它简单地展示了如何获取用户输入的值并将其传递给另一个路由。