2017-05-09 13 views
3

name: labelのディクテーションに基づいてフィールドを持つフォームクラスを定義したいとします。私はほぼ成功した以下を試しました。しかし、テンプレートのフィールドをレンダリングするとAttributeError: 'UnboundField' object has no attribute '__call__'となりました。フォームにフィールドを動的に追加するにはどうすればよいですか?フィールドを動的にWTFormsフォームに追加する

def build_form(name, record): 
    class ContactForm(FlaskForm): 
     name = StringField(name) 
     fieldlist = {} 

     for key, value in record.items(): 
      fieldlist[key] = StringField(key) 

    @app.route('/', methods=['GET', 'POST']) 
    def showform(): 
     form = ContactForm(request.form) 

     if request.method == 'POST': 
      return 'form processed' 

     return render_template('cardcompare.tpl', record=record, form=form) 
<form method=post> 
    {{ form.name() }} 
    {% for key, value in record.items() %} 
     {{ form.fieldlist[key]() }} 
    {% endfor %} 
    <input type=submit value=Register> 
</form> 

答えて

2

フォームクラスの属性として、新たなフィールドを追加するsetattrを使用してください。これにより、WTFormsは、バインドされていないフィールドを保持するのではなく、フィールドを正しく設定します。あなたがattrフィルターを使用してフィールドを反復処理することができますテンプレートで

# form class with static fields 
class MyForm(FlaskForm): 
    name = StringField('static field') 

record = {'field1': 'label1', 'field2': 'label2'} 

# add dynamic fields 
for key, value in record.items(): 
    setattr(MyForm, key, StringField(value)) 

{% for key, value in record.items() %}: 
    {{ form|attr(key)() }} 
{% endfor %} 
+0

ありがとう、ありがとうございましたが、動的なフィールドをテンプレート内で繰り返すことができる構造に追加する方法はありますか? (例のフィールドリストのような)?目標は、動的フィールドをテンプレート内の静的とは異なる方法で処理することです。 – Omniver

+0

その部分は編集によって過度に削除されました。私はそれを回復した。 – Feodoran

+0

私は、フォームに属性リストを渡す必要があるので、 'setattr'をMyFormの' __init__'の中に入れて同じことをしました。最初の実行以外は動作します、なぜ分かりますか? – TomSawyer

関連する問題