データベースバリデーターを使用できます。
外部テーブルからの値を含む選択ボックスが表示されます: ( 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 プラグインを使用して複数のフィールドをレンダリングすることを強くお勧めします。