使用wtforms和flask设置selectfield的默认值

19

我正在创建一个产品编辑表单,需要在表单中预填上之前的数据。

我正在进行以下操作:

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上附加默认值?


2
form.category.data = 1 或者 form.category.data = 2 - falsetru
1
我尝试了,但不起作用。 - kfk
3
按照falsetru所说,但在设置前将coerce转换为整数:category = SelectField('category', choice=[(1,'one'),(2,'two')], coerce=int)。这里的form是产品表单实例。 - Hernán Acosta
2个回答

18

如果您想设置默认值以在渲染页面时显示表单,您可以创建自己的表单或设置值:

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

QuerySelectField 怎么样,我们能做到吗? - Tri

12

来自WTForms文档

请注意,choices关键字只会被评估一次,因此如果您想要创建一个动态下拉列表,您需要在实例化后将choices列表分配给该字段。

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


QuerySelectField 怎么样,我们能做到吗? - Tri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接