python - Flask WTForms 使用变量自动填充 StringField

标签 python flask flask-wtforms wtforms

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

表单.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

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

最佳答案

您可以通过传递 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

关于python - Flask WTForms 使用变量自动填充 StringField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51483645/

相关文章:

python - 在 Windows 上安装 rpy2

python - Django 模板 : False vs. 无

python - 如何在 Flask/Jinja 中做嵌套注释?

python - 使用 WTForms 和 Flask 预填充编辑表单

双重嵌套 for 循环的 Pythonic 快捷方式?

python - 由 Python 多处理 fork 的空 python 进程的私有(private)内存

python - 如何使 PDF 可用于 flask 搜索应用程序的搜索?

python - Flask 的 url_for 引发 TypeError : 'function' object has no attribute '__getitem__'

python - Flask - 带有动态标签的切换按钮

recaptcha - 如何使用 Bootstrap/wtf 模板为 RecaptchaField 定义自定义错误消息以显示它