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

2024-05-13

如果我在构建字段期间设置默认值,则一切都会按预期工作:

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 http://werkzeug.pocoo.org/docs/0.14/datastructures/#werkzeug.datastructures.MultiDict as FlaskForm https://flask-wtf.readthedocs.io/en/stable/api.html#flask_wtf.FlaskForm's formdata争论。

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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐