2

SQLFORM を使用して生成されたテーブルに新しいレコードを作成するためのフォームがあります。テーブルのフィールドの 1 つは、ユーザーに直接公開されるのではなく、テーブルの一部ではない他のいくつかの入力要素の値に基づいて作成されます。

テーブルの一部ではなく、データベース挿入の一部である必要のない追加のフィールドを SQLFORM に追加するにはどうすればよいですか? また、データベースに挿入する前に非公開フィールドを計算する場所はどこでしょうか?

(架空の例では、テーブルに緯度と経度の座標フィールドがありますが、住所フィールドはありません。この例では、緯度/経度フィールドに座標をジオコーディングして保存するために使用できる作成フォームに住所フィールドが必要です)

4

2 に答える 2

2

これを解決した方法は、SQLFORM.factoryの代わりに使用することでしSQLFORMた。

1.テーブルで定義されたフィールドを抽出しました

fields = [field for field in db.customer]

2.私が欲しかった新しいフィールドを追加しました

fields += [
    Field('customer_type','string', label=T('Customer Type'),
         requires=IS_IN_SET(customer_types, zero=None, sort=False)),
    Field('another_field','string', label=T('Another Field')),
    ]

3. SQLFORM.factory を使用してフォームを生成する

form = SQLFORM.factory(
    *fields,
    formstyle='bootstrap',
    _class='customer form-horizontal',
    table_name='customer'
    )

* 前のアスタリスクfieldsが必要であることに注意してください

4.まだ使用されてform.process().acceptedいますが、必要なものを計算し、データベースの挿入を手動で処理しました

if form.process().accepted:
    ...
    form.vars.some_nonwritable_field = calculate_complicated_value()
    db.customer.insert(**db.customer._filter_fields(form.vars))
    ...

_filter_fields動的に追加されたフィールドが挿入の一部になるのを防ぎます。

このようにして、検証されたが挿入の一部ではないフォームに追加のフィールドを追加できました。

于 2013-11-05T03:10:37.420 に答える