如何根据 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   {{ 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] 为您的默认值,或其他一些确定,或者只是不提供默认值,它将自动成为列表中的第一个。
我创建了一个 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   {{ 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] 为您的默认值,或其他一些确定,或者只是不提供默认值,它将自动成为列表中的第一个。