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

时间:2018-07-29 03:22:23

标签: python flask python-3.6 flask-wtforms wtforms

如果我在构造字段时设置了默认值,则所有工作都将按预期进行:

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。

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

3 个答案:

答案 0 :(得分:2)

您可以通过将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)

答案 1 :(得分:0)

您可以作为字典访问__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类的文档。

答案 2 :(得分:0)

来回答这个问题已经很晚了,但是我看到了一个简单的方法,上面的答案中没有提到。赋值的最简单方法是

@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