18

このドキュメントhttp://wtforms.simplecodes.com/docs/1.0.2/specific_problems.html#dynamic-form-compositionに従って、動的フィールドを持つ WTForms でフォームを生成しようとしています。

ユーザーがリストから購入するアイテムを選択できるようにするこのサブフォーム クラスがあります。

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 でこれを達成する方法はありませんか?

4

6 に答える 6

10

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

レシピフォーム.py

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

ビュー.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)

この投稿も役に立ちました

于 2013-05-06T05:04:36.877 に答える
7
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 関数を持っています。

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

于 2013-08-19T23:06:22.420 に答える
6

完全なコードを記述したり、コードをテストしたりせずに投稿しますが、アイデアが得られるかもしれません。また、これは必要なデータを埋めるのに役立つだけかもしれません。

データを表示して選択できるようにするには、 を入力する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',...}

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

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

于 2012-10-12T07:14:23.803 に答える
1

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

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

form = F()
form.fld.append_entry()
于 2014-09-11T20:03:16.630 に答える