【发布时间】:2015-10-14 11:31:16
【问题描述】:
我很少发现尚未解决的问题,但我已经搜索了 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 值,行:行 它显示了不同动物的完全相同的行数据。
这是显示表单项上的检查器的图像:http://i.stack.imgur.com/oFtF8.png
如何获取网格行的行 id 而不是引用的 id?
非常感谢任何帮助!
【问题讨论】: