2.9. formatオプションの動作

formatオプションはレコードの表示方法を指定します。このオプションの設定については define_table() にて説明しています。

設定したformatオプションは、次の3つの状況において動作します。

以下、設定したテーブルのフィールドが、他のテーブルのフィールドから reference(参照)定義されている場合です。

  1. フォーム上にレコードの選択フィールドがある場合、このオプションに設定されたフォーマットでレコード表示をします。
  2. 他テーブルのフィールドにrepresent属性を付ければ、このオプションでフィールドを表示します。
  3. 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フィールドを見てみます。

../../_images/web2py_dal_009r.JPG

選択フィールドには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)

実際に動かしてみた結果は次のようになります。

../../_images/web2py_dal_010r.JPG

SQLTABLEではrepresent属性で設定しなくても、formatオプションの形式で表示します。