Как установить значение по умолчанию для WTForms SelectField?

При попытке установить значение по умолчанию для SelectField с помощью WTForms, я передаю значение параметру «по умолчанию», как это делается.

class TestForm(Form): test_field = SelectField("Test: ", choices=[(1, "Abc"), (2, "Def")], default=2) 

Я также пробовал следующее.

 class TestForm(Form): test_field = SelectField("Test: ", choices=[(1, "Abc"), (2, "Def")], default=(2, "Def")) 

По умолчанию для выбранного поля не задано значение «Def.». Это работает для других видов полей, таких как TextField. Как установить значение по умолчанию для SelectField?

  • wtforms Подкласс класса класса и упорядочение полей
  • Flask-WTF - validate_on_submit () никогда не выполняется
  • Подтвердить форму WTForm на основе нажатой кнопки
  • рендеринг форм с флягой + wtform
  • Проверка соответствия уникальности при проверке формы в App Engine
  • Определите, какая кнопка WTForms была нажата в окне «Флажок»
  • Как получить форму с повторяющимися элементами
  • Как использовать поле FieldList WFForms для FormFields?
  • 5 Solutions collect form web for “Как установить значение по умолчанию для WTForms SelectField?”

    Первый способ, который вы опубликовали, является правильным, и он работает для меня. Единственное объяснение, почему он не работает, может заключаться в том, что вы используете более старую версию WTForms, она работала для меня на 1.0.1

    Я считаю, что эта проблема вызвана атрибутом data Field переопределяющим default по default тем, что WTForms не понимает (например, объект модели БД – он ожидает int ). Это произойдет, если вы заполнили форму в конструкторе следующим образом:

     form = PostForm(obj=post) 

    решение состоит в том, чтобы вручную установить атрибут data после заполнения формы:

     form = PostForm(obj=post) form.category.data = (post.category.id if page.category else 0) # I make 0 my default 

    Есть несколько способов сделать это. Ваш первый фрагмент кода действительно правильный.

    Если вы хотите сделать это в представлении динамически, вы также можете:

     form = TestForm() form.test_field.default = some_default_id form.process() 

    Это настройки choices с помощью SelectField когда вы используете int , он работает следующим образом:

     test_select = SelectField("Test", coerce=int, choices=[(0, "test0"), (1, "test1")], default=1) 

    или:

     class TestForm(Form): test_select = SelectField("Test", coerce=int) @app.route("/test") def view_function(): form = TestForm() form.test_select.choices = [(0, "test0"), (1, "test1")] form.test_select.default = 1 form.process() 

    Flask-WTF 0.14.2 пользователь здесь. Таким образом, этот ответ для всех, у кого есть аналогичная проблема со мной.

    В принципе, ни одно из предыдущих решений не работает корректно с помощью form.validate_on_submit() .

    Установка form.test_field.data действительно изменит значение по умолчанию при загрузке страницы, но данные остаются неизменными после validate_on_submit (пользовательские изменения в браузере не влияют).

    Установив form.test_field.default тогда call form.process() также изменит значение при загрузке страницы, но validate_on_submit завершится с ошибкой.

    Вот новый способ сделать это:

     class TestForm(Form): test_field = SelectField("Test", choices=[(0, "test0"), (1, "test1")]) @app.route("/test") def view_function(): form = TestForm(test_field=1) if form.validate_on_submit(): ... 
    Python - лучший язык программирования в мире.