Flask WTF формы: может ли отображаться новое поле, если пользователь выбирает определенный выбор в SelectMultipleField? - PullRequest
0 голосов
/ 24 мая 2018

Я только начал использовать формы Flask WTF.Я могу делать с ними все, что мне нужно, кроме того, что я не могу понять одну вещь.У меня есть поле с множественным выбором, представляющее пользователю различные варианты, и если пользователь выбирает «другие», я хочу, чтобы они описали, что они значат.Например:

 impact = wtforms.SelectMultipleField('What is the expected impact?',
                           choices=[('Sales', 'Sales'),
                                    ('Lift', 'Lift'),
                                    ('Other', 'Other')]

Я не знаю, возможно ли это, даже если это не независимое поле с собственным идентификатором, а просто элемент в массиве.Не могли бы вы помочь?

РЕДАКТИРОВАТЬ

Вот что я попытался, следуя предложенному ниже предложению - это не сработало в том смысле, что выбор или отмена выбора «Другое» не делаетразница:

app.py:

app.route('/', methods=['GET', 'POST'])
def home():
     form = MyForm()
     other_enable = False

       if form.validate_on_submit():

          name = form.name.data
          email = form.email.data
          impact1 = form.impact.data
          impact = ''.join(str(e) for e in impact1)

          if ("Other" in impact):
              other_enable = True
          impact_other = form.impact_other.data
          return redirect(url_for('home'))
       return(render_template('home.html', form=form, other_enable=other_enable))

и templates / home.html содержит

{% extends "base.html" %}

{% import "bootstrap/wtf.html" as wtf %}

<center>

  <div id="someid" onchange='myFunction(other_enable)'>{{ wtf.quick_form(form) }}</div>

</center>

{% endblock %}

<script>
     function myFunction(other_enable) {
         var theother = document.getElementById("otherField");

         if (other_enable == true){
            theother.style.display = "block";
        } else {
            theother.style.display = "none";
        }
    }
 </script>

1 Ответ

0 голосов
/ 24 мая 2018

Вы должны добавить еще одно поле в вашей форме, например TextField() и сделать его validator.Optional().

Затем с простым javascript и событием onchange вы можете display:none это поле по умолчанию, и если пользовательвыберите Other показать его.

В конце, если вы хотите, чтобы пользователь «описал, что они значат», вы можете добавить в класс YourForm этот метод:

def validate(self):
    """ Add custom validators after default validate
    """
    success = super(YourFormClass, self).validate()

    if 'Other' in self.impact.data and len(self.impact_other.data) < 1:
        success = False
        self.impact.errors.append(gettext('Please fill impact_other field if you had selected "Other"'))

    return success

(при условии, что другое полесозданный вами файл имеет имя impact_other)

РЕДАКТИРОВАТЬ: я немного изменил свою функцию validate () для работы с SelectMultilpleField вместо SelectField

Далее, вам не нужно передавать other_enable переменнуюв ваш шаблон, по умолчанию, если ничего не выбрано, вы должны скрыть otherField, поэтому вам нужно запускать js не только onchange, но и после загрузки страницы.

Вы просто должны проверить в своей функции js if 'Другое 'выбрано в вашем поле impact, если да, то покажите свое поле.Вы можете посмотреть этот вопрос для получения дополнительной помощи при обнаружении выбранных значений в JS: здесь

Кроме того, вам нужно сделать form = MyForm(request.form), чтобы сохранить ввод пользователя, если проверка формы не удалась.

...