Web2py:表示引用字段

时间:2015-07-23 23:11:45

标签: reference web2py

我很少发现一个尚未回答的问题,但我已经搜索了3天并且还没有找到任何东西。

我的目标是创建一个以“电子表格”格式输入记录的页面。我在this slice的SQLFORM.grid中使用了内联编辑。

我遇到的问题是,当其中一个字段是对另一个表的引用时,lambda函数中使用的行将获取引用表的行而不是网格中的行。

这是一个例子: 的模型

db.define_table('people',
            Field('name', 'string'),
            format = '%(name)s',
            )

db.define_table('animals',
            Field('name', 'string'),
            Field('pet_owner', 'reference people'),
            format = '%(name)s',
            )

控制器

def index():
    #process submitted form
    if len(request.post_vars) > 0:
        print request.post_vars
        for key, value in request.post_vars.iteritems():
            (field_name,sep,row_id) = key.partition('_row_')
            if row_id:
                db(db.animals.id == row_id).update(**{field_name:value})

    db.animals.name.represent = lambda value,row:  SQLFORM.widgets.string.widget(db.animals.pet_owner,value, **{'_name':'name_row_%s' % row.id})

    db.animals.pet_owner.represent = lambda value,row:  SQLFORM.widgets.options.widget(db.animals.pet_owner,value, **{'_name':'pet_owner_row_%s' % row.id})

    grid = SQLFORM.grid(db.animals,
                        selectable= lambda ids : redirect(URL('animals',vars=request._get_vars)),
                        )
    grid.elements(_type='checkbox',_name='records',replace=None)  #remove selectable's checkboxes
    return dict(grid=grid)

首先看起来网格工作正常。但是,在检查引用字段的下拉列表时,如果两个连续的行具有相同的值(例如,具有相同所有者的两个动物),则在名称(pet_owner_row_1)中使用相同的行,这意味着将传递给进程的值提交的表单不是整数(例如3),而是由管道分隔的整数(例如“| 3 | 3 |”)。

我已经确认这是问题所在,方法是将代表更改为     db.animals.pet_owner.represent = lambda值,row:row 它显示了不同动物的完全相同的行数据。

以下图片显示了表单项上的检查器:http://i.stack.imgur.com/oFtF8.png

如何获取网格行的行ID而不是引用的id?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

这是最近在主分支中fixed但尚未发布的错误。与此同时,解决方法是暂时将字段更改为整数类型:

db.animals.pet_owner.type = 'integer'
db.animals.pet_owner.represent = lambda value,row: SQLFORM.widgets.options.widget(
    db.animals.pet_owner,value, **{'_name':'pet_owner_row_%s' % row.id})