如何根据 Flask 中其他 QuerySelectField 的选择值填充 QuerySelectField

How to fill QuerySelectField based on Other QuerySelectField's selected value in Flask

我创建了一个 WTForm。在该表单中,两个 QuerySelectField 用于州选择和地区选择。我想根据 State QuerySelectField 的值填充 District QuerySelectField。我在项目中使用了以下表格。请指导我做。

def district_choices():
    return District.query.all()

def state_choices():
    return State.query.all()

class CreateForm(FlaskForm):
    code = StringField('Code', validators=[DataRequired()])
    name = StringField('Name',validators=[validators.required(), validators.Length(max=32)])
    state = QuerySelectField('State',query_factory=state_choices, get_label='name', validators=[validators.required()])
    district = QuerySelectField('District',query_factory=district_choices, get_label='name', validators=[validators.required()])

当您填充区域 select 字段时,基于之前的 selection,您是在重定向到一个新页面还是全部发生在同一页面上?如果是这样,则需要使用 JavaScript。

例如。我的解决方案看起来像这样...... 在 jinja 文件中

<head>
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.7.1.min.js"></script>

    <script>
        function makeChange() {
            var new_selection= $("#week_range_date").val();
            window.location.href = "/time_expenses/"+new_selection
        }

    </script>
</head>

{{ week_start_date_form.csrf_token }}
  <div onchange="makeChange()">
      Select Week to View &emsp; {{ week_start_date_form.week_range_date }}
  </div>

然后你需要一个路由来像这样从 JavaScript 捕获你的重定向。

@app.route("/time_expenses/<week_start_date>", methods=['GET', 'POST'])
def time_expenses(week_start_date):

然后将您的参数值发送到这样的表单

    # create form for date range drop down
    WeekStartDateForm = inititalizeWeekStartDateForm(week_start_date)
    week_start_date_form = WeekStartDateForm()

在你的表单文件中你可以做这样的事情

def inititalizeWeekStartDateForm(default_value):
    # do any logic here in order to create your values needed for choices and default value, you can then use them inside the class below
    class WeekStartDateForm(FlaskForm):
        week_range_date = SelectField('Select Date Range', choices=created_dates, default=default_value)
    return WeekStartDateForm 

编辑:

以防万一不清楚。 上面当我说“# do any logic here” 你需要做这样的事情

created_dates = []
table_objects = TableName.query.filter_by(condition_here="value_here").all()
for table_object in table_objects:
    created_dates.append(table_object.column_name)

^^这样做,您可以获取 table 中给定列所需的所有值,并将它们放入列表中,并将它们用作 SELECT 下拉列表的选择场地。 然后做类似的事情 created_dates[0] 为您的默认值,或其他一些确定,或者只是不提供默认值,它将自动成为列表中的第一个。