Установка значения по умолчанию в поле выбора с использованием wtforms и flask

Я создаю форму редактирования продукта, и мне нужно, чтобы форма была предварительно заполнена предыдущими данными.

Я делаю следующее:

Product(form):
    product = TextField('name')
    category = SelectField('category', choice=[(1,'one'),(2,'two')])

В представлении:

form.product.data = 'A product name from the database'
form.category.data = 'a category name' #This does not work

Проблема связана с SelectField.

Я понимаю, что есть значение по умолчанию, которое я могу установить в SelectField. Однако это происходит в классе определения формы, и там у меня еще нет объекта запроса из sqlalchemy.

Итак, есть ли способ добавить значение по умолчанию в selectfield во время выполнения?


person kfk    schedule 13.07.2013    source источник
comment
Я пытался. Не работает.   -  person kfk    schedule 13.07.2013
comment
Это как говорит falsetru, но перед установкой coerce как int: category = SelectField('category', choice=[(1,'one'),(2,'two')], coerce=int). form является экземпляром Product Form.   -  person Hernán Acosta    schedule 21.01.2014


Ответы (2)


Если вы хотите установить значение по умолчанию для отображения страницы с формой, вы можете создать собственную форму или установить значение:

class Product(Form):
    product = TextField('name')
    category = SelectField('category', choices=[(1,'one'),(2,'two')])

# create instance with predefined value:
form1 = Product(category=2)
# form1.product == <input id="product" name="product" type="text" value="">
# form1.category == <select id="category" name="category">
#                     <option value="1">one</option>
#                     <option selected value="2">two</option>
#                   </select>
# from1.product.data == None
# form1.category.data == 2

# create own form if it need many times:
Product2 = type('Product2', (Product,), {
    'category': SelectField('category', default=2, choices=[(1,'one'),(2,'two')])
})
form2 = Product2()
# form2.product == <input id="product" name="product" type="text" value="">
# form2.category == <select id="category" name="category">
#                     <option value="1">one</option>
#                     <option selected value="2">two</option>
#                   </select>
# from2.product.data == None
# form2.category.data == 2

Если вы хотите установить данные формы по умолчанию по запросу:

with app.test_request_context(method='POST'):
    form = Product(request.form)
    # form5.category.data == None

    form = Product(request.form, category=2)
    # form5.category.data == 2

with app.test_request_context(method='POST', data={'category': 1}):
    form = Product(request.form)
    # form5.category.data == 1

    form = Product(request.form, category=2)
    # form5.category.data == 1
person tbicr    schedule 14.07.2013
comment
Как насчет QuerySelectField, мы можем это сделать..? - person Tri; 07.10.2019

Из документации WTForms

Обратите внимание, что ключевое слово выбора оценивается только один раз, поэтому, если вы хотите создать динамический раскрывающийся список, вам нужно назначить список вариантов для поля после создания экземпляра.

Product(form):
    product = TextField('name')
    category = SelectField('category')

И тогда, по-твоему, скажи

form.category.choices = [list of choices with chosen data]

Более подробную информацию можно найти здесь: http://wtforms.simplecodes.com/docs/0.6.1/fields.html#wtforms.fields.SelectField

person AlexLordThorsen    schedule 13.07.2013
comment
Как насчет QuerySelectField, мы можем это сделать..? - person Tri; 07.10.2019