1

次の方法で作成されたフォームを変更する方法が見つからないようです。

from gluon.tools import Crud
crud = Crud(globals(), db)

form = crud.create(db.table_name)

テーブルで外部キーを使用しているため、自動生成されたフォームでは整数 (外部主キーを表す) のみが許可されますが、外部データ フィールドに必要なデータ型を入力できるようにしたいと考えています (識別子のみ)。プライマリ テーブルのデータ型 (自動インクリメントのプライマリ キー) ではなく、外部テーブルのデータ型を使用するようにcreate()関数に指示する簡単な方法はありますか?

4

1 に答える 1

3

データベースバリデーターを使用できます。

外部テーブルからの値を含む選択ボックスが表示されます: ( http://web2py.com/book/default/chapter/07?search=requires#Database-Validatorsから):

IS_IN_DB

次の表と要件を考慮してください。

db.define_table('person', Field('name', unique=True))
db.define_table('dog', Field('name'), Field('owner', db.person)
db.dog.owner.requires = IS_IN_DB(db, 'person.id', '%(name)s',
                                 zero=T('choose one'))

犬の INSERT/UPDATE/DELETE フォームのレベルで適用されます。データベース db のフィールド person.id で、dog.owner が有効な ID である必要があります。このバリデーターにより、dog.owner フィールドはドロップボックスとして表されます。バリデーターの 3 番目の引数は、ドロップボックス内の要素を説明する文字列です。この例では、人 %(id)s ではなく人 %(name)s を表示したいと考えています。%(...)s は、各レコードの括弧内のフィールドの値に置き換えられます。

IS_IN_SETゼロ オプションは、バリデータと非常によく似た働きをします。

フィールドを検証したいが、ドロップボックスは必要ない場合は、バリデーターをリストに入れる必要があります。

db.dog.owner.requires = [IS_IN_DB(db, 'person.id', '%(name)s')]

バリデーターの最初の引数は、データベース接続または DAL セットにすることができますIS_NOT_IN_DB

ドロップボックスが必要な場合 (上記のリスト構文を使用したくない場合) で、追加のバリデーターを使用したい場合があります。この目的のために、IS_IN_DB バリデーターは追加の引数 _and を取り、検証された値が IS_IN_DB 検証に合格した場合に適用される他のバリデーターのリストを指すことができます。たとえば、サブセットに含まれていない db 内のすべての犬の所有者を検証するには、次のようにします。

subset=db(db.person.id>100)
db.dog.owner.requires = IS_IN_DB(db, 'person.id', '%(name)s',
                                 _and=IS_NOT_IN_DB(subset,'person.id'))

IS_IN_DB とタグ付け

IS_IN_DB バリデーターには、オプションの属性 multiple=False があります。True に設定すると、複数の値を 1 つのフィールドに格納できます。このフィールドは、第 6 章で説明されているように list:reference 型である必要があります。タグ付けの明示的な例については、そこで説明されています。複数の参照は作成フォームと更新フォームで自動的に処理されますが、DAL に対して透過的です。jQuery multiselect プラグインを使用して複数のフィールドをレンダリングすることを強くお勧めします。

于 2010-08-18T22:21:33.000 に答える