为了账号安全,请及时绑定邮箱和手机立即绑定

用动态默认值创建RadioField的正确方法?

用动态默认值创建RadioField的正确方法?

万千封印 2021-03-30 13:09:11
这是我所拥有的代码,并且可以正常工作。MyForm是一个表单类,仅定义一个RadioField。在RadioField这里没有默认的规定,因为我们不知道它会包含哪些项目尚未有。my_form接收项目列表并创建一个,MyForm其中将项目添加到中RadioField,然后(至关重要地)选择列表中的第一个项目作为默认项目。from wtforms.fields.core import RadioFieldfrom wtforms.validators import Requiredfrom flask_wtf.form import Formclass 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 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

看起来您正在同时使用my_form()表单创建和表单验证。您需要致电:


form = my_form(create_items())

或者您可以简单地使用:


form = MyForm()

if form.validate_on_submit():

    ...

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


查看完整回答
反对 回复 2021-04-02
  • 1 回答
  • 0 关注
  • 322 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号