Flask WTForms用变量自动填充StringField

时间:2018-07-23 16:43:45

标签: python flask flask-wtforms wtforms

我有一个表格,希望自动使用上一页中收到的信息来填充某些字段,但是如果他们要调整它,则需要将其更改。我正在为自己的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后将字段设置为更新为None,则可以无错误地更改变量。但是,它不会覆盖form.name.data值

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

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

1 个答案:

答案 0 :(得分:2)

您可以通过将MultiDictformdata参数传递FlaskForm * 来设置字段的初始值。

from werkzeug.datastructures import MultiDict

form = NewForm(formdata=MultiDict({'name': 'Foo'}))

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

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