【发布时间】:2013-06-17 12:52:10
【问题描述】:
这是我得到的代码,它有效。 MyForm 是一个表单类,它只定义了一个RadioField。 RadioField这里没有指定默认值,因为我们还不知道它将包含哪些项目。 my_form 获取一个项目列表并创建一个 MyForm 并将项目添加到 RadioField,并且(至关重要)选择列表中的第一个项目作为默认项目。
from wtforms.fields.core import RadioField
from wtforms.validators import Required
from flask_wtf.form import Form
class MyForm(Form):
"""
User chooses an item.
"""
itemid = RadioField(validators=[Required()])
def my_form(items):
"""
Returns a MyForm object populated with appropriate items.
"""
form = MyForm()
form.itemid.choices = [(item.id, item.name)
for item in sorted(items, key=lambda i: i.order)]
if items and form.itemid.data == u'None':
# None ensures we don't overwrite submitted data
form.itemid.data = items[0].id
return form
支票and form.itemid.data == u'None' 真的很难闻。这样做的原因是,如果没有该检查,我们会覆盖提交的数据。 IE。当我们使用这样的形式时...
@APP.route('/page_one', methods=['GET', 'POST'])
def page_one():
form = my_form(dynamic_items())
if form.validate_on_submit():
itemid = form.itemid.data
return redirect(url_for('page_two', itemid=itemid))
else:
return render_template('page_one.html', form=form)
...如果我们没有那个臭检查,我们将表单数据设置为设置默认值,但是在form.validate_on_submit()由于用户提交表单而将通过的情况下,通过设置默认值我们破坏了用户提交的实际数据。
当然,显而易见的答案似乎是 my_form 应该只是设置默认值,所以臭检查应该变成:
if items:
form.itemid.default = items[0].id
但这不起作用,似乎是因为 form.itemid.data 没有数据,而这实际上是用来构造 HTML 的。
所以问题是:这样做的正确方法是什么?
【问题讨论】:
标签: python flask wtforms flask-wtforms