【问题标题】:Web2py: Incorrect row when representing a referenced fieldWeb2py:表示引用字段时行不正确
【发布时间】: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?

非常感谢任何帮助!

【问题讨论】:

    标签: reference web2py


    【解决方案1】:

    这是一个 bug,最近在 master 分支中 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})
    

    【讨论】:

    • 非常感谢您的回复。我已经从 master 分支克隆,它现在按预期工作。很烦人,我花了这么多时间试图解决它,但也因为知道我没有做错任何事而松了一口气。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2014-11-06
    • 2014-04-24
    • 1970-01-01
    • 2020-07-09
    相关资源
    最近更新 更多