【问题标题】:Why deleted record ignores its format in web2py?为什么删除的记录会忽略它在 web2py 中的格式?
【发布时间】:2015-12-02 16:51:56
【问题描述】:

我有一张桌子:

db.define_table('mytable', Field('name', 'string'), Field('is_active', 'boolean', writable=False, readable=False, default=True), format='%(name)s')

我已启用记录版本控制。后来我为 mytable_archive 创建了一个网格。这个网格有一个 current_record 列,由于我之前指定的格式,它向我显示了记录的名称,但是如果我删除了这个记录(web2py 将 is_active 字段设置为 false),我的网格不会显示我的 current_record 的格式我之前指定的格式,它只显示id。 我知道该记录实际上并没有被删除,那为什么我的网格只显示这个记录 ID 而不是名称?

对不起,我的英语很抱歉,提前感谢您的任何回复。

【问题讨论】:

    标签: web2py


    【解决方案1】:

    当您指定format 参数时,任何引用表的引用字段都将获得一个默认的represent 属性,该属性将从表中获取引用的记录并将represent 函数应用于它。但是,在使用记录版本控制时,删除的记录(即带有is_active == False 的记录)会自动从所有查询中过滤掉,因此represent 函数将无法检索引用的记录,因此无法生成表示的值(并且而是回退到显示存储在参考字段中的原始 ID)。

    但是,如果您考虑一下,一旦从原始表中删除了一条记录,当前记录的想法就没有任何意义。因此,一旦原始记录被标记为非活动状态,current_record 字段的represent 函数可能更适合显示类似None 的内容。

    无论如何,如果您真的想从已删除记录中查看名称,在创建显示存档表的网格之前,您可以暂时禁用 is_active 过滤,方法是:

    db.mytable._common_filter = None
    

    注意,如果您在同一请求中对 db.mytable 执行任何后续查询,则必须先恢复 db.mytable._common_filter,然后再继续:

    common_filter, db.mytable._common_filter = db.mytable._common_filter, None
    grid = SQLFORM.grid(db.mytable_archive, ...)
    db.mytable._common_filter = common_filter
    

    【讨论】:

    • db.mytable._common_filter = None 仅在我请求存档网格时禁用通用过滤器?还是对整个应用程序禁用?
    • 所有代码都在每个请求上执行,因此该请求的其余部分将被禁用。在不执行该特定代码的单独请求上,过滤仍然有效。为了安全起见,您始终可以在创建网格后恢复_common_filter(我将使用该选项编辑答案)。
    • 非常感谢,它按预期工作。现在我可以看到是哪个用户删除了记录。
    猜你喜欢
    • 2015-12-03
    • 2021-10-20
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2019-10-17
    相关资源
    最近更新 更多