繁体   English   中英

我可以在字段构造函数之外设置 StringField 的默认值吗?

[英]Can I set a StringField's default value outside the field constructor?

如果我在该字段的构建过程中设置了默认值,则一切都按预期工作:

my_field = StringField("My Field: ", default="default value", validators=[Optional(), Length(0, 255)])

但是,如果我尝试以编程方式设置它,则没有效果。 我试过像这样修改__init__方法:

class MyForm(FlaskForm):
    my_field = StringField("My Field: ", validators=[Optional(), Length(0, 255)])

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.my_field.default = "set default from init"  # doesn't work

这不会设置默认值。 如何以编程方式执行此操作(因为该值是基于数据库查询的动态值,如果我在__init__之外执行此操作,则它不会获得最新值)?

我的requirements.txt相关版本:

Flask==0.12
Flask-WTF==0.14.2
WTForms==2.1

另外,如果这很重要,我正在运行 Python 3.6。

或者,我对一个解决方案很好,它使我能够在添加新记录时在初始表单加载时设置该字段的值数据(与在构造函数中指定的默认值相同的行为)但是这个相同的表单也用于编辑所以我不希望它更改已在编辑时保存/存储的对象数据。

您可以通过将MultiDict作为FlaskFormformdata参数传递来设置字段的初始值。

from werkzeug.datastructures import MultiDict

class MyForm(FlaskForm):
    my_field = StringField("My Field: ", validators=[Optional(), Length(0, 255)])


form = MyForm(formdata=MultiDict({'my_field': 'Foo}))

这将在呈现表单时将my_field输入的值设置为 'Foo',覆盖该字段的默认值。 但是,当表单回发到服务器时,您不想覆盖这些值,因此您需要检查处理程序中的请求方法:

from flask import render_template, request
from werkzeug.datastructures import MultiDict

@app.route('/', methods=['GET', 'POST'])
def test():
    if request.method == 'GET':
        form = MyForm(formdata=MultiDict({'my_field': 'Foo'}))
    else:
        form = MyForm()
    if form.validate_on_submit():
        # do stuff
    return render_template(template, form=form)

您可以将__init__中的字段作为字典访问:

class MyForm(FlaskForm):

  def __init__(self, *args, **kwargs):
     default_value = kwargs.pop('default_value')
     super(MyForm, self).__init__(*args, **kwargs)
     self['my_field'] = StringField("My Field: ", default=default_value,
                                    validators=[Optional(), Length(0, 255)])

然后你会这样称呼它:

form = MyForm(default_value='Foo')

有关更多信息和其他详细信息,请参阅wtforms.form.Form类的文档。

回答这个问题为时已晚,但我看到了一种简单的方法来做到这一点,上面的答案中没有提到。 分配值的最简单方法是

@app.route('/xyz', methods=['GET', 'POST'])
def methodName():
    form = MyForm()
    form.field.data = <default_value>
    .....
    return render_template('abc.html', form=form)

页面加载时,表单的field将显示指定的default_value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM