WTForms:如果数据存在,用数据填充表单
WTForms: populate form with data if data exists
我有以下 Flask-WTF 表格:
class PersonForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
age = IntegerField('Age', validators=[NumberRange(min=0)], render_kw={'type': 'number'})
educated = BooleanField('Educated', render_kw={'type': 'checkbox'})
我知道我可以通过将值传递到表单中来预填充表单,如下所示:
form = PersonForm(name='Johnny', age=25, educated=True)
我注意到有一种更好的方法可以通过将对象注入表单来实现这一点(参考文献 here and here)。我尝试了以下方法,但是它不起作用。我哪里出错了(对象应该是字典以外的东西)?
person = {'name': 'Johnny', 'age': 25, 'educated'=True}
form = PersonForm(obj=person)
请注意,这些预先填充的值来自数据库。有些值已定义,有些则未定义。例如,另一个 "person" 可能看起来像 {'name': 'Jessica', 'educated': True}
(在这种情况下年龄字段将为空)。
你需要一个 MultiDict
>>> a
{'hello': 'data', 'more': 'data'}
>>> from werkzeug.datastructures import MultiDict
>>> b=MultiDict(a)
>>> b
MultiDict([('hello', 'data'), ('more', 'data')])
>>>
我认为您想改用 data
参数,如 this 文档中所述:
The Form class
class wtforms.form.Form
Declarative Form base class.
Construction
__init__(formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs)
Parameters:
...
data – Accept a dictionary of data. This is only used if formdata and obj are not present.
...
示范:
>>> from wtforms import Form, StringField, validators
>>>
>>> class UsernameForm(Form):
username = StringField('Username', [validators.Length(min=5)], default=u'test')
email = StringField('Email', [validators.email(message='Check your email')], default=u'test@domain.com')
>>>
>>> person = {'username': 'Johnny', 'email': 'Johny@domain.net'}
>>>
>>> form = UsernameForm(data=person)
>>>
>>> form.username.data
'Johnny'
>>>
>>> form.email.data
'Johny@domain.net'
它也适用于 formdata
参数,但您必须传递一个 MultiDict
对象:
>>> from werkzeug.datastructures import MultiDict
>>>
>>> b = MultiDict(person)
>>>
>>> b
MultiDict([('email', 'Johny@domain.net'), ('username', 'Johnny')])
>>>
>>>
>>> form2 = UsernameForm(formdata=b)
>>> form2.username.data
'Johnny'
>>> form2.email.data
'Johny@domain.net'
>>>
同时 **kwargs
作为常规字典传递:
>> form3 = UsernameForm(**person)
>>>
>>> form3.username.data
'Johnny'
>>>
>>> form3.email.data
'Johny@domain.net'
编辑:回复 OP 关于使用 obj
参数的评论并引用文档:
__init__(formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs)
Parameters:
...
obj – If formdata is empty or not provided, this object is checked for attributes matching form field names, which will be used for field values.
...
这意味着你需要传入一个对象,其属性名称与你的表单的属性名称相同,如下所示:
>>> class Person:
username = 'Johny'
email = 'Johny@domain.net'
>>>
>>> form = UsernameForm(obj=Person)
>>>
>>> form.data
{'email': 'Johny@domain.net', 'username': 'Johny'}
我有以下 Flask-WTF 表格:
class PersonForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
age = IntegerField('Age', validators=[NumberRange(min=0)], render_kw={'type': 'number'})
educated = BooleanField('Educated', render_kw={'type': 'checkbox'})
我知道我可以通过将值传递到表单中来预填充表单,如下所示:
form = PersonForm(name='Johnny', age=25, educated=True)
我注意到有一种更好的方法可以通过将对象注入表单来实现这一点(参考文献 here and here)。我尝试了以下方法,但是它不起作用。我哪里出错了(对象应该是字典以外的东西)?
person = {'name': 'Johnny', 'age': 25, 'educated'=True}
form = PersonForm(obj=person)
请注意,这些预先填充的值来自数据库。有些值已定义,有些则未定义。例如,另一个 "person" 可能看起来像 {'name': 'Jessica', 'educated': True}
(在这种情况下年龄字段将为空)。
你需要一个 MultiDict
>>> a
{'hello': 'data', 'more': 'data'}
>>> from werkzeug.datastructures import MultiDict
>>> b=MultiDict(a)
>>> b
MultiDict([('hello', 'data'), ('more', 'data')])
>>>
我认为您想改用 data
参数,如 this 文档中所述:
The Form class
class wtforms.form.Form
Declarative Form base class. Construction
__init__(formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs) Parameters:
...
data – Accept a dictionary of data. This is only used if formdata and obj are not present. ...
示范:
>>> from wtforms import Form, StringField, validators
>>>
>>> class UsernameForm(Form):
username = StringField('Username', [validators.Length(min=5)], default=u'test')
email = StringField('Email', [validators.email(message='Check your email')], default=u'test@domain.com')
>>>
>>> person = {'username': 'Johnny', 'email': 'Johny@domain.net'}
>>>
>>> form = UsernameForm(data=person)
>>>
>>> form.username.data
'Johnny'
>>>
>>> form.email.data
'Johny@domain.net'
它也适用于 formdata
参数,但您必须传递一个 MultiDict
对象:
>>> from werkzeug.datastructures import MultiDict
>>>
>>> b = MultiDict(person)
>>>
>>> b
MultiDict([('email', 'Johny@domain.net'), ('username', 'Johnny')])
>>>
>>>
>>> form2 = UsernameForm(formdata=b)
>>> form2.username.data
'Johnny'
>>> form2.email.data
'Johny@domain.net'
>>>
同时 **kwargs
作为常规字典传递:
>> form3 = UsernameForm(**person)
>>>
>>> form3.username.data
'Johnny'
>>>
>>> form3.email.data
'Johny@domain.net'
编辑:回复 OP 关于使用 obj
参数的评论并引用文档:
__init__(formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs)
Parameters:
...obj – If formdata is empty or not provided, this object is checked for attributes matching form field names, which will be used for field values.
...
这意味着你需要传入一个对象,其属性名称与你的表单的属性名称相同,如下所示:
>>> class Person:
username = 'Johny'
email = 'Johny@domain.net'
>>>
>>> form = UsernameForm(obj=Person)
>>>
>>> form.data
{'email': 'Johny@domain.net', 'username': 'Johny'}