2017-03-23 8 views
0

存在し、私は、次のフラスコ-WTFのフォームを持っている場合は、データとフォームを移入:WTForms:データは

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) 

フォームにオブジェクトを注入することでこれを行うより良い方法があることに気付きました(参照herehere)。私は以下を試してみましたが、うまくいきません。どこが間違っているのですか(オブジェクトは辞書以外のものになっていますか?)

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

これらの事前設定された値は、データベースに由来します。いくつかの値は定義されていないものがありますたとえば、別の「人物」は{'name': 'Jessica', 'educated': True}のように見えます(この場合、年齢フィールドは空白になります)。

+0

MultiDict。これはフラスコ要求の投稿データが返されるものです。これは、フラスコの要求でポストデータとともに使用するためのものです。 – Artagel

+0

データベースから取得するデータからMultDictを作成するにはどうすればよいですか? –

+0

'form = PersonForm(data = person)'を代わりに使ってみましたか? –

答えて

1

必要があります。

Formクラス

クラスwtforms.formを。フォーム

宣言フォーム基本クラス。 建設

__init__(formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs) 
    Parameters: 

...

データ - データの辞書を受け入れます。 formdataとobjが存在しない場合にのみ使用されます。 ...

デモンストレーション:

>>> 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'[email protected]') 
>>> 
>>> person = {'username': 'Johnny', 'email': '[email protected]'} 
>>> 
>>> form = UsernameForm(data=person) 
>>> 
>>> form.username.data 
'Johnny' 
>>> 
>>> form.email.data 
'[email protected]' 

それだけでなく、formdataパラメータで動作しませんが、あなたはMultiDictオブジェクトを渡す必要があります。また

>>> from werkzeug.datastructures import MultiDict 
>>> 
>>> b = MultiDict(person) 
>>> 
>>> b 
MultiDict([('email', '[email protected]'), ('username', 'Johnny')]) 
>>> 
>>> 
>>> form2 = UsernameForm(formdata=b) 
>>> form2.username.data 
'Johnny' 
>>> form2.email.data 
'[email protected]' 
>>> 

**kwargsを正規の辞書として渡します:

>> form3 = UsernameForm(**person) 
>>> 
>>> form3.username.data 
'Johnny' 
>>> 
>>> form3.email.data 
'[email protected]' 

EDIT:

__init__(formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs) 

パラメータ::objパラメータとドキュメントからの引用の使用に関するOPさんのコメントへの返信で
...

OBJ - FORMDATAがある場合空であるか指定されていない場合、フィールド値に使用されるフォームフィールド名に一致する属性がこのオブジェクトでチェックされます。

...次のようにあなたは、あなたのフォーム属性名と同じ属性名を持つオブジェクトを渡す必要があることを意味

:うん、それはする必要があります

>>> class Person: 
     username = 'Johny' 
     email = '[email protected]' 

>>> 
>>> form = UsernameForm(obj=Person) 
>>> 
>>> form.data 
{'email': '[email protected]', 'username': 'Johny'} 
+0

恐ろしい答えありがとうございます。だから、 'obj'パラメータは何のために使われますか? –

+0

@ jcmetz21、私は私の答えを更新しました –

+0

非常に役立ちました!ありがとう –

0

あなたは私はあなたがthis文書で述べたように、代わりにdataパラメータを使用したいと思いますMultiDict

>>> a 
{'hello': 'data', 'more': 'data'} 
>>> from werkzeug.datastructures import MultiDict 
>>> b=MultiDict(a) 
>>> b 
MultiDict([('hello', 'data'), ('more', 'data')]) 
>>> 
+0

私はこのMultiDictをフォームに渡してみましたが、幸運はありません: 'form = PersonForm(obj = MultiDict(person))' –

+0

dbデータは辞書ですか? – Artagel

+0

試してみてください:form = PersonForm(); form.populate_obj(req) – Artagel

関連する問題