這似乎爲我工作:
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並提供兩個表:
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部分。