我在网上搜索了实现此目的的方法,并找到了多种解决方案。他们中的大多数都有困惑的代码,都有缺点。一些想法涉及根据记录设置所有数据库字段的默认值。其他人的工作方式为appending multiple SQLFORMs ,这导致页面上的缩进存在差异(因为它是 1 个表单中的 2 个 HTML 表格)。
我正在寻找一种紧凑而优雅的方式来提供基于两个表上的联接的记录的只读表示。当然必须有一些简单的方法来实现这一目标,对吗? Web2py 书仅包含 insert-form 的示例。这就是我正在寻找的这种简洁的解决方案。
将来我可能还需要提供更新功能的多表表单,但现在如果我可以获得一个简单的记录只读表单,我会很高兴。
如果有任何建议,我将不胜感激。
最佳答案
这似乎对我有用:
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 部分。
关于forms - Web2py - 多表只读形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11422654/