【问题标题】:Proper way to create a RadioField with a dynamic default value?创建具有动态默认值的 RadioField 的正确方法?
【发布时间】: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


    【解决方案1】:

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

    form = my_form(create_items())
    

    或者你可以简单地使用:

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

    那么my_form()只用于创建表单。

    【讨论】:

    • MyForm 需要填充项目,用于显示和验证。我想我可以有没有设置默认值的form = my_form_for_submission(items),然后是if form.validate_on_submit(),然后是form = my_form_for_display(items),以创建一个具有默认设置的新实例,以显示给用户。是这个意思吗?
    • 是的。从长远来看,将功能分开将使其更容易。尽可能共享代码(DRY),不要使用条件使函数复杂化。
    • 好的,我很高兴接受这个答案。但是,您能否指出任何建议通常不应将同一个 Form 实例同时用于检查验证/提交以及显示的参考资料?举个反例,see The Flask Mega-Tutorial。也许这是名誉扫地或过时?
    • Flask 和 Django 使用单一请求方法,而 Webapp2(Google 的 App Engine)使用拆分 get() 和 post() 方法:webapp-improved.appspot.com/tutorials/gettingstarted/…您可以选择最适合您的样式。我强烈支持非常简单的方法:构建表单或验证表单,而不是两者兼而有之。这将使您以后更容易扩展它们(例如,使用 AJAX)。哦,还有更少的“臭味”检查!
    • 但是这个是烧瓶。这个问题的单一请求方法解决方案是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多