我很少发现一个尚未回答的问题,但我已经搜索了3天并且还没有找到任何东西 .
我'm aiming to create a page for inputing records in a '电子表格' like format. I'已在this slice的SQLFORM.grid中使用内联编辑 .
我遇到的问题是,当其中一个字段是对另一个表的引用时,在lambda函数中使用的行将获取引用表的行而不是网格中的行 .
这是一个例子: Model
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',
)
Controller
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 回答
这是最近在主分支中的fixed但尚未发布的错误 . 与此同时,解决方法是暂时将字段更改为整数类型: