使用动态默认值创建RadioField的正确方法是什么?

时间:2013-06-17 12:52:11

标签: python flask wtforms flask-wtforms

这是我得到的代码,这是有效的。 MyForm是一个表单类,它只定义RadioFieldRadioField此处未指定默认值,因为我们不知道它将包含哪些项目。 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'闻起来很糟糕。原因是没有检查,我们会覆盖提交的数据。即当我们使用这样的表格时......

@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的内容。

所以问题是:做这件事的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

看起来您正在使用my_form()进行表单创建和表单验证。你需要打电话:

form = my_form(create_items())

或者你可以简单地使用:

form = MyForm()
if form.validate_on_submit():
    ...

然后my_form()仅用于表单创建。