これは私にとってはうまくいくようです:
def test():
fields = [db.tableA[field] for field in db.tableA.keys() \
if type(db.tableA[field]) == type(db.tableA.some_field)]
fields += [db.tableB[field] for field in db.tableB.keys() \
if type(db.tableB[field]) == type(db.tableB.some_field)]
ff = []
for field in fields:
ff.append(Field(field.name, field.type))
form = SQLFORM.factory(*ff, readonly=True)
return dict(form=form)
field.required、field.requires validtaorsなどを追加できます。また、SQLFORM.factoryを使用しているため、それを検証して更新/挿入できるはずです。Field
このメソッドを使用して作成しているフォームに、更新用のフォームを検証するために必要なすべての情報が含まれていることを確認してください。上記のインスタンス化に簡単に追加できると思います。
編集:そうそう、レコードIDに基づいてフォームを事前入力するには(フォームが定義された後)、問題のレコードの値を取得する必要があります...また..リスト内包表記の代わりに、 SQLFORM.factoryを使用して、次の2つのテーブルを提供できます。
def test():
form = SQLFORM.factory(db.tableA, db.tableB, readonly=True)
record = ... (query for your record, probably based on an id in request.args(0))
for field in record.keys():
if (*test if this really is a field*):
form.vars[field] = record[field]
return dict(form=form)
事前入力用の疑似コードのみを提供したため、多少の調整が必要になります...ただし、 http://web2py.com/books/default/chapter/29/7#Pre-populating-the-formとSQLFORM/SQLFORM.factoryセクション。