python - Flask WTForms 用变量自动填充 StringField
问题描述
我有一个表格,我想用前一页收到的信息自动填写一些字段,但如果他们想调整它,它需要是可更改的。我正在为我的 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
FlaskForm
formdata
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 具有处理值列表以及像 normal 一样的单个值的方法dict
。
推荐阅读
- react-native - 如何在 rxjs6 中使用 combineLatest 和 flatMap?
- ios - 一个 tableView 有两个不同的 cell.xib ,如果我按下一个单元格,它需要显示第二个单元格。如何?
- xml - 我想使用 Powershell 向现有 XML 文件添加新元素
- c# - 使用 RemoveRange 删除 EF6 中的实体非常慢
- java - 交换 JFrame 两次后 JFrame 显示为空白(使用 Intellij GUI 设计器)
- java - 无法将类型“java.lang.String”的属性值转换为属性“日期”所需的类型“java.util.Date”:它不完全是 10 个字符长
- node.js - 获取对等客户端证书的套接字 io 始终返回空对象
- php - 从错误页面的标签标题中删除“Wordpress”
- c# - C# 条件编译中是否有 OR 运算符?
- javascript - 在 stat 方法之前检查权限以避免错误