2012-07-10 37 views
2

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

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

未来我可能需要多表格形式来提供更新功能,但现在我会很高兴,如果我可以得到一个简单的只读格式的记录。

我将不胜感激任何建议。

回答

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