2016-12-13 114 views
0

我要生成使用数据库表中的sqlform.grid定义为:动态改变字段值

db.define_table('ClientInfo', 
      Field('HostID', type='text', label='HostID'), 
      Field('MACAddress', type='text', label='MACAddress'), 
      Field('MachineName', type='text', label='MachineName'), 
      Field('IPAddress', type='text', label='IPAddress'), 
      Field('TimeOffset', label='TimeOffset'), 
      Field('RunningAs', type='text', label='RunningAs'), 
      Field('SystemVersion', type='text', label='SystemVersion'), 
      Field('OSType', type='integer', label='OSType'), 
      Field('AgentVersion', type='text', label='AgentVersion'), 
      Field('FirstCheckin', type='datetime', label='FirstCheckin'), 
      Field('LastCheckIn', type='datetime', label='LastCheckIn') 
      ) 

的OSTYPE字段是一个枚举型整数,因此我想改变它在显示之前,以便它不是通过整数而是通过字符串来标识操作系统类型(例如0 = Windows XP,1 = Windows 2012,而不是)。是否有捷径可寻?

回答

0

要更改网格中的显示以及只读表格,请使用字段的represent属性(请参阅文档的this section的末尾)。

您还可以添加一个IS_IN_SET验证程序,默认情况下会导致以任何形式(例如,网格创建和编辑窗体)选择窗口小部件。你可以传递一个元组的字典或列表来验证指定一组标签与关联值(见的文档this section年底):

OS_TYPES = { 
    0: 'Windows XP', 
    1: 'Windows 2012', 
    ... 
} 

db.define_table('ClientInfo', 
    ... 
    Field('OSType', type='integer', 
      requires=IS_IN_SET(OS_TYPES), # Results in select widget in forms. 
      represent=lambda v, r: OS_TYPES[v]), # Sets display value in grid. 
    ...) 
+0

感谢您的信息,但我更寻找如何修改.grid或.smartgrid输出,而不是显示OSType列的0,1,2等,它显示标签。我尝试修改Field()条目,如你所建议的那样,它没有改变.grid输出:( – tjac

+0

@tjac使用替代表示法。编写一个返回值的函数(例如Windows XP,Windows 2012 ..)给定的id /整数(例如0,1 ..)。阅读[Field constructor- represent](http://www.web2py.com/books/default/chapter/29/06/the-database-abstraction-layer#Field-constructor) 。'db.ClientInfo.OSType.represent = lambda os_id,row:_get_os_name(os_id)'。您也可以使用'IS_IN_SET()'的字典,这将很容易 –

+0

对不起,原来的答案只是集中在窗体也可以创建/编辑记录)答案已经更新,可以处理表单小部件和显示网格中的值。 – Anthony