【问题标题】:Flask WTForms autofill StringField with variableFlask WTForms 用变量自动填充 StringField
【发布时间】:2018-12-31 04:36:37
【问题描述】:

我有一个表单,我想用上一页收到的信息自动填写一些字段,但如果他们想调整它,它需要是可更改的。我正在为我的 SelectField 使用动态创建的列表,但添加 StringField 不成功。请参阅下面的代码:

forms.py

class get_vals(var):
    ...
    typs = var.p_typs
    p_name = var.p_name
    return typs,p_name

class NewForm(FlaskForm):
    name = StringField('Name', validators=[DataRequired()])
    typ1 = SelectField('Type', validators=[Optional()])

    def __init__(self,var):
        super(NewForm,self).__init__()
        typs,p_name = get_vals(var)

        self.typ1.choices = typs
        self.name.default = p_name

使用:

self.name.default 

将我的姓名表格留空。如果我使用:

self.name.data

它将正确的信息放入表单中,但是您不能更改值并且必须使用它放置的任何内容,这不是一个选项。

...
<form action="" method="post">
    {{ form.hidden_tag() }}
    <p>
        {{ form.name.label }}
        {{ form.name(size=24) }}
        {{ form.typ1.label }}
        {{ form.typ1() }}
    </p>
...

有没有办法设置变量的默认值并使其可变?谢谢

更新 如果我在运行获取名称变量的表单后将尝试更新的字段设置为无,我可以更改变量而不会出错。但是,它不会覆盖 form.name.data 的值

form = NewForm(var)
    var.name == None
    if form.validate_on_submit():
        var.name = form.name.data

这会运行(在表单中显示正确的变量并且可以调整)但在您提交表单时不会覆盖该值,我该如何覆盖该值?

【问题讨论】:

    标签: python flask flask-wtforms wtforms


    【解决方案1】:

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

    from werkzeug.datastructures import MultiDict
    
    form = NewForm(formdata=MultiDict({'name': 'Foo'}))
    

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

    from flask import render_template, request
    from werkzeug.datastructures import MultiDict
    
    @app.route('/', methods=['GET', 'POST'])
    def hello():
        if request.method == 'GET':
            form = NewForm(formdata=MultiDict({'name': 'foo'}))
        else:
            form = NewForm()
        if form.validate_on_submit():
            # do stuff
        return render_template(template, form=form)
    

    * MultiDict 是必需的,因为在 HTML 表单中可能有多个具有相同 name 属性的输入,并且 MultiDict 具有处理值列表以及单个值(如正常dict

    【讨论】:

    • 当我尝试这个解决方案时,我得到:TypeError: __init__() got an unexpected keyword argument 'formdata'
    • @shellcat_zero 你确定使用FlaskForm吗?什么版本的 wtf_flask?
    • 是的,我的示例就像使用class NewForm(FlaskForm) 的原始问题一样。至于版本:In [3]: flask_wtf.__version__ Out[3]: '0.14.2'
    • 奇怪 - 文档清楚地显示 formdata 是可接受的关键字。也许您可以提出minimal reproducible example 并提出一个新问题?现在(工作中)看不到,但可能稍后/明天。
    • 发现我的错误,它有效。从我目前观察到的情况来看,MultiDict 似乎不适用于更新SelectField 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2021-07-09
    • 1970-01-01
    • 2016-06-23
    • 2013-11-03
    • 2021-03-04
    • 1970-01-01
    相关资源
    最近更新 更多