2

次のようなフォームがあります。

class AddProductForm(Form):
    title = TextField('Title')
    type = QuerySelectField('Type',
        query_factory=lambda: ProductType.query.order_by(ProductType.sequence).all())

    def __init__(self, formdata=None, obj=None, prefix='', **kwargs):
        try:
            product_type_id = ProductType.query.filter_by(name=obj['product_type']).one().product_type_id
            kwargs.setdefault('type', product_type_id)
        except NoResultFound:
            pass

        Form.__init__(self, formdata, obj, prefix, **kwargs)

ご覧のとおり、フォームが読み込まれたときに product_type に適切なデフォルトを与えるように設定しようとしています。ただし、この種のコードは、例としてタイトルを設定するために機能しましたが、QuerySelectField の「タイプ」では機能しません。これを修正する方法はありますか?

これが不可能であると仮定すると、フォーム要素をフォームに動的に追加する方法を知っている人はいますか?

4

2 に答える 2

11

WTForms の QuerySelectField でデフォルト値を定義するには、フィールド定義で直接行うことができます。

my_field = QuerySelectField(
    label=u"My Label",
    query_factory=lambda: Model.query(...),
    get_pk=lambda item: item.id,
    get_label=lambda item: item.name,
    allow_blank=True,
    default=lambda: Model.query.filter(...).one())

ただし、見た目よりも少し単純ではありません。これを考慮してください:

  • デフォルト値はcallableでなければなりません
  • この callable は、モデルのオブジェクト インスタンスを返す必要があります (pk ではなく、オブジェクト全体)。
  • フォーム インスタンスの初期化にobjまたはformdataが使用されていない場合にのみ使用されます (どちらの場合も、デフォルト値は無視されます)。

あなたの場合、初期化時に手元にない obj の属性を使用してデフォルト値を初期化しているため、代わりにファクトリを使用できます。

def add_product_form_factory(default_type_name):
    class AddProductForm(Form):
        title = TextField('Title')
        type = QuerySelectField('Type',
            query_factory=lambda: ProductType.query.order_by(ProductType.sequence).all(),
            default=ProductType.query.filter_by(name=default_type_name).one()
        )
    return AddProductForm

ここに、パラメーターに従ってフォームを構成する関数があります (この場合、呼び出し可能であるデフォルトは必要ありません)。

AddProductForm = add_product_form_factory(default_type_name='foo')
form = AddProductForm()

ps。フォーム ファクトリの利点は、フォームを動的に操作して、フィールドを作成したり、実行時に選択肢を設定したりできることです。

于 2015-03-29T13:03:21.197 に答える
3

次のようなパラメーターを使用します。

QuerySelectField(allow_blank=True, blank_text=u'-- please choose --', ...)

デフォルトの選択オプションを追加できます

于 2012-04-08T04:46:05.217 に答える