修改Web2py中sqlform.grid()的列输出

时间:2012-03-13 03:59:51

标签: python web2py

我已经开始将web2py用于Web应用程序,并尝试使用SQLFORM.grid(...)显示我的一个db-table数据的分页列表,如下面的最小示例所示。

grid=SQLFORM.grid(query,
    links=links,
    fields=[db.example.date,db.example.foo, db.example.bar])

db.example.date字段包含UTC中的Python datetime.datetime对象。目前,它显示就像那样。但是,我希望能够更好地控制实际输出,我可以设置本地时区并将输出字符串修改为“2小时前”。

如另一个问题[0]所示,我可以使用links插入新列。不幸的是,我似乎无法通过我以这种方式插入的字段对行进行排序。此外,它们插入右侧而不是实际替换我的第一列。所以这似乎不是一个解决方案。

总结一下:我如何控制最终打印db.example.date的方式?

[0] Calculated Fields in web2py sqlgrid

3 个答案:

答案 0 :(得分:4)

您可以在模型中定义表格时实现目标。您在define_table中使用的Field构造函数中的represent参数将被SQLFORM.grid识别。例如,如果您只想使用月份名称打印日期,则可以将以下内容放入模型中。

Field('a_date', type='date', represent=lambda x, row: x.strftime("%B %d, %Y")),

您的功能也可以转换为当地时间。

答案 1 :(得分:0)

您需要使用prettydate更改人性化字符串中的日期时间和格式,并在Field()描述符的represent参数中调用它。例如:

from gluon.tools import prettydate
db.example.date.represent = lambda v,r: prettydate(r.date)

这样,db.example.date的任何显示都将显示为人性化,包括通过SQLFORM.grid

答案 2 :(得分:0)

如果您不希望按照David Nehme的回答以这种方式表示日期。在网格创建之前,您可以在控制器中设置db.table.field.represent。

db.example.date.represent = lambda value, row: value.strftime("%B %d, %Y")

接着是。

grid = SQLFORM.grid(query,....

我连接表时经常使用它。如果模型文件中的表示中存在row.field,则它会中断,因为它必须更具体,即row.table.field。