Как я могу передавать данные между SelectMultipleFields? - PullRequest
0 голосов
/ 31 марта 2019

Я новичок в 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 ничего не делает. Как я могу получить форму 2 для обновления после нажатия кнопки Отправить?

1 Ответ

0 голосов
/ 01 апреля 2019

После того, как все выходные я ударился головой, я наконец нашел ответ. Проблема в том, что валидаторы по умолчанию в 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)

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

Works as intended

...