python - WTForms:如果数据存在,则用数据填充表单

标签 python forms wtforms flask-wtforms

我有以下 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)

我注意到有一种更好的方法可以通过将对象注入(inject)到表单中来实现此目的(引用 herehere )。我已经尝试过以下方法,但是,它不起作用。我哪里出错了(该对象应该是字典以外的东西吗)?

person = {'name': 'Johnny', 'age': 25, 'educated'=True}
form = PersonForm(obj=person)

请注意,这些预先填充的值来自数据库。有些值已定义,有些则未定义。例如,另一个“人”可能看起来像 {'name': 'Jessica', 'eduated': True} (在这种情况下,年龄字段将为空)。

最佳答案

我认为您想改用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'}

关于python - WTForms:如果数据存在,则用数据填充表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42984453/

相关文章:

Python:将数据拟合给定的余弦函数

python - 如何检查pandas中两个日期时间之间的日期时间

python - Pytorch:有没有类似torch.argmax的函数,真的可以保持原始数据的维度?

css - 重新设置表单按钮的 CSS 代码

python-3.x - 使用 wtforms 验证 FileField

python - 过滤查询其金额字段的总和大于或小于数字

forms - 如何使用 A2lix 翻译形式使用学说 knp 可翻译扩展来订购已翻译的未翻译字段?

jQuery 检测点击禁用的提交按钮

python - Flask-Admin:如何使用 on_model_change 更改模型?

python - flask WTForms : Difference between DataRequired and InputRequired