我很少发现一个尚未回答的问题,但我已经搜索了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?
非常感谢任何帮助!
答案 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})