このドキュメントに従って動的フィールドを持つWTFormsでフォームを生成しようとしています http://wtforms.simplecodes.com/docs/1.0.2/specific_problems.html#dynamic-form-composition
私は、ユーザーがリストから購入するアイテムを選択できるようにするこのサブフォームクラスを持っています:
class Item(Form):
itmid = SelectField('Item ID')
qty = IntegerField('Quantity')
class F(Form):
pass
ショッピングアイテムには複数のカテゴリがあるため、ユーザーが選択するカテゴリに基づいて動的な選択フィールドを生成したいと思います。
fld = FieldList(FormField(Item))
fld.append_entry()
しかし、次のエラーが発生します。
AttributeError: 'UnboundField' object has no attribute 'append_entry'
私は何か間違ったことをしていますか、それともWTFormsでこれを達成する方法はありませんか?
私は今夜この問題に遭遇し、これに行き着きました。これが将来の人々に役立つことを願っています。
class RecipeForm(Form):
category = SelectField('Category', choices=[], coerce=int)
...
@mod.route('/recipes/create', methods=['POST'])
def validateRecipe():
categories = [(c.id, c.name) for c in g.user.categories.order_by(Category.name).all()]
form = RecipeForm(request.form)
form.category.choices = categories
...
@mod.route('/recipes/create', methods=['GET'])
def createRecipe():
categories = [(c.id, c.name) for c in g.user.categories.order_by(Category.name).all()]
form = RecipeForm(request.form)
form.category.choices = categories
return render_template('recipes/createRecipe.html', form=form)
私はこれを見つけました 投稿 同様に役に立ちました
class BaseForm(Form):
@classmethod
def append_field(cls, name, field):
setattr(cls, name, field)
return cls
from forms import TestForm
form = TestForm.append_field("do_you_want_fries_with_that",BooleanField('fries'))(obj=db_populate_object)
私はすべてのフォームに拡張クラスBaseFormを使用し、クラスに便利なappend_field関数を持っています。
(フォームフィールドの)インスタンスはフィールドを追加できないため、フィールドが追加されたクラスを返します。
完全なコードを記述したり、コードをテストしたりせずに投稿すること。また、これは必要なデータの入力にのみ役立つ可能性があります。
データを表示して選択するには、choices
にSelectField
を入力する必要があります。どこに記入しますか?最初の入力はフォーム定義に含める必要がありますが、動的な入力が必要な場合は、このフォームを作成してユーザーに表示する場所で変更することをお勧めします。 form = YourForm()
を実行し、それをテンプレートに渡すビューのように。
フォームの選択フィールドに選択肢を入力するにはどうすればよいですか?あなたはタプルのリストを持っている必要があり、次にこのようなものがあります:
form.category_select.choices = [(key, categories[key]) for key in categories]
form.category_select.choices.insert(0, ("", "Some default value..."))
categories
ここには、{1:'One', 2:'Two',...}
のような形式のカテゴリを含む辞書が必要です。
したがって、フォームを定義するときに選択肢に何かを割り当てる場合は、最初からそのデータがあり、ユーザーのカテゴリが必要な場合は、ビューで上書きするだけです。
それがあなたにいくつかのアイデアを与え、あなたが前進できることを願っています:)
fieldList定義の代わりにフォームインスタンスでappend_entry()
を呼び出してみましたか?
class F(Form)
fld = FieldList(SelectField(Item))
form = F()
form.fld.append_entry()
これは私がそれを働かせた方法です。
class MyForm(FlaskForm):
mylist = SelectField('Select Field', choices=[])
@app.route("/test", methods=['GET', 'POST']
def testview():
form = MyForm()
form.mylist.choices = [(str(i), i) for i in range(9)]
不思議なことに、coerce=int
を使用すると、このすべてが機能しなくなります。私は自分がflask
初心者なので、coerce=int
がなぜ問題を引き起こすのか本当にわかりません。