Web2py - 多表只读表单

时间:2012-07-10 21:56:31

标签: forms html-table web2py

我在网上搜索了实现这一目标的方法,并找到了多种解决方案。他们中的大多数都有凌乱的代码,所有这些都有缺点。一些想法涉及根据记录设置所有数据库字段的默认值。其他人在appending multiple SQLFORMs工作,这导致页面上的缩进不同(因为它是1个表格中的2个HTML表格)。

我正在寻找一种紧凑而优雅的方式,基于两个表上的连接提供记录的只读表示。当然必须有一些简单的方法来实现这一点,对吧? Web2py书只包含insert-form的示例。这是我正在寻找的这种简洁的解决方案。

将来我可能需要提供更新功能的多表格表格,但是现在如果我能为记录获得一个简单的只读表格,我会很高兴。

我非常感谢任何建议。

1 个答案:

答案 0 :(得分:2)

这似乎对我有用:

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部分。