Как я могу передавать данные между SelectMultipleFields?

#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)
  

Если мне понадобятся средства проверки, мне придется написать пользовательские для этого типа поля.

Работает так, как задумано