#python #flask #wtforms
#python #flask #wtforms
Вопрос:
Я новичок в Flask и WTForms и действительно испытываю трудности с этой простой задачей. Я хочу отобразить список опций. Пользователь может выбрать несколько параметров, а затем эти варианты генерируют новый список выбираемых параметров.
Чтобы упростить ситуацию на данный момент, я просто пытаюсь напрямую взять выбранные параметры из одного SelectMultipleField и установить их в качестве вариантов во втором SelectMultipleField:
class SelForm(FlaskForm):
choices = []
selections = SelectMultipleField('Available Streams', choices=choices)
submit = SubmitField('Choose Streams')
@streams_blueprint.route('/select', methods=['GET','POST'])
def select():
# Grab a selectable list of studies from database.
form = SelForm()
db_objects = [(stream.id, stream.name) for stream in Stream.objects()]
form.selections.choices = db_objects
if form.validate_on_submit():
form2 = SelForm()
selections = form.selections.data
form2.selections.choices = selections
else:
form2 = SelForm()
return render_template('select_streams.html', form=form, form2=form2)
Что бы я ни пытался, формы всегда отображаются в их начальном состоянии ( form.selections.choices=db_objects
и form2.selections.choices=[]
). validate_on_submit
Сегмент ничего не делает. Как я могу заставить form2 обновляться после нажатия кнопки отправить?
Ответ №1:
После того, как я бился над этим все выходные, я наконец нашел ответ. Проблема в том, что средства проверки по умолчанию в SelectMultipleField
на самом деле не работают. Если я заменю validate_on_submit
на is_submitted
, код запустится. Эта версия делает то, что я хочу:
@streams_blueprint.route('/select', methods=['GET','POST'])
def select():
# Grab a selectable list of studies from database.
form = SelForm()
db_objects = [(stream.id, stream.name) for stream in Stream.objects()]
form.selections.choices = db_objects
if form.is_submitted():
form2 = SelForm()
selections = form.selections.data
new_objects = [(stream.id, stream.name) for stream in Stream.objects(id__in=selections)]
form2.selections.choices = new_objects
else:
form2 = SelForm()
return render_template('select_streams.html', form=form, form2=form2)
Если мне понадобятся средства проверки, мне придется написать пользовательские для этого типа поля.