2.9. formatオプションの動作¶
formatオプションはレコードの表示方法を指定します。このオプションの設定については define_table()
にて説明しています。
設定したformatオプションは、次の3つの状況において動作します。
以下、設定したテーブルのフィールドが、他のテーブルのフィールドから reference(参照)定義されている場合です。
- フォーム上にレコードの選択フィールドがある場合、このオプションに設定されたフォーマットでレコード表示をします。
- 他テーブルのフィールドにrepresent属性を付ければ、このオプションでフィールドを表示します。
- SQLTABLEではrepresent属性を付けなくても、このオプションでフィールドを表示します。
文章で記述すると難しくなってしまいますので、この3つの動作について具体例で説明します。
説明には次の2つのテーブルを使用します。
db.define_table('person',
Field('name'), format='%(name)s')
db.define_table('dog',
Field('owner_id', db.person),
Field('name'))
1.フォーム上での表示
dogテーブルへの登録用に次のようなSQLFORMを作成します。
def dog_form():
form = SQLFORM(db.dog)
if form.accepts(request.vars, session):
response.flash = 'form accepted'
elif form.errors:
response.flash = 'form has errors'
else:
response.flash = 'please fill out the form'
return dict(form=form)
フォームを実際に動かして、owner_idフィールドを見てみます。
選択フィールドにはpersonテーブルのidフィールドではなく、formatで設定した内容が自動で表示されるようになります。
2.フィールドにrepresent属性を設定して表示
dogテーブルを普通に表示すると次のようになります。
>>> for row in db(db.dog).select():
... print row.name, row.owner_id
Masodusa 2
Tamatodu 2
Tatapapa 5
owner_idはpersonテーブルのidになります。
これをformatオプションで設定した形式で表示させるには、represent属性を使います。
>>> for row in db(db.dog).select():
... print row.name, db.dog.owner_id.represent(row.owner_id)
Masodusa Poduduma
Tamatodu Poduduma
Tatapapa Cototoda
represent属性は次の形式で使用します。
参照元Fieldインスタンス.represent(参照元のフィールド値)
represent属性を使う理由は represent を参照ください。
もちろん次のように 再帰的select や テーブル結合(join) を使用すれば、同じことが可能です。
>>> for row in db(db.dog).select():
... print row.name, row.owner_id.name
Masodusa Poduduma
Tamatodu Poduduma
Tatapapa Cototoda
しかしformatオプションで複雑な表示設定を行っている場合など、represent属性を使うのがよいでしょう。
3.SQLTABLEでの表示
SQLTABLEを使ったリスト表示サンプルを作ってみます。
def dog_list():
rows = db(db.dog).select()
return dict(rows=rows)
実際に動かしてみた結果は次のようになります。
SQLTABLEではrepresent属性で設定しなくても、formatオプションの形式で表示します。