web-dev-qa-db-ja.com

WTFormsで動的フィールドを生成するにはどうすればよいですか

このドキュメントに従って動的フィールドを持つ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でこれを達成する方法はありませんか?

18
ChiliConSql

私は今夜​​この問題に遭遇し、これに行き着きました。これが将来の人々に役立つことを願っています。

RecipeForm.py

class RecipeForm(Form):
    category = SelectField('Category', choices=[], coerce=int)
    ...

views.py

@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)

私はこれを見つけました 投稿 同様に役に立ちました

10
Matt Carrier
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関数を持っています。

(フォームフィールドの)インスタンスはフィールドを追加できないため、フィールドが追加されたクラスを返します。

7
dezza

完全なコードを記述したり、コードをテストしたりせずに投稿すること。また、これは必要なデータの入力にのみ役立つ可能性があります。

データを表示して選択するには、choicesSelectFieldを入力する必要があります。どこに記入しますか?最初の入力はフォーム定義に含める必要がありますが、動的な入力が必要な場合は、このフォームを作成してユーザーに表示する場所で変更することをお勧めします。 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',...}のような形式のカテゴリを含む辞書が必要です。

したがって、フォームを定義するときに選択肢に何かを割り当てる場合は、最初からそのデータがあり、ユーザーのカテゴリが必要な場合は、ビューで上書きするだけです。

それがあなたにいくつかのアイデアを与え、あなたが前進できることを願っています:)

6
Ignas Butėnas

fieldList定義の代わりにフォームインスタンスでappend_entry()を呼び出してみましたか?

class F(Form)
  fld = FieldList(SelectField(Item))

form = F()
form.fld.append_entry()
1
John Ong

これは私がそれを働かせた方法です。

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がなぜ問題を引き起こすのか本当にわかりません。

1
Rohit