我在web2py中定义了一个包含以下某些字段的表:
Field('frequency_range_start', 'float', requires=[IS_NOT_EMPTY(), IS_FLOAT_IN_RANGE(0,1000000000)], label="Frequency Start (kHz)", represent=lambda value, row:__represent_kHz(value)),
Field('frequency_range_end', 'float', requires=[IS_NOT_EMPTY(), IS_FLOAT_IN_RANGE(0,1000000000)], label="Frequency End (kHz)", represent=lambda value, row:__represent_kHz(value)),
Field('channel_size', 'list:string', requires=[IS_NOT_EMPTY(), IS_FLOAT_IN_RANGE(0,1000000000)], label="Channel Sizes (kHz)", represent=lambda value, row:__represent_kHz_list(float(value))),
我需要 channel_size 作为浮点值列表。我还需要在表单上进行验证 - 需要标签在上面的两个字段中进行验证...
问:如何创建此字段以便仅在表单上验证浮点值?
我在这里查看了“这本书”http://web2py.com/books/default/chapter/29/06#Field-types
但它听起来像你可以替换任何类型 - >列表:...
也许我可以在某处使用正则表达式来检查可能是也可能不是实数的数字
答案 0 :(得分:1)
首先,不需要IS_NOT_EMPTY
验证器,因为您使用的后续验证器已经需要非空值。
使用list:
字段,您可以使用IS_LIST_OF
验证程序。即使您将浮点数存储为字符串,也可以使用IS_FLOAT_IN_RANGE
验证程序,因为它将值传递给float()
。
注意,为了在选择值后更容易使用值,您可以指定filter_out
函数从字符串列表转换为浮点列表:
Field('channel_size', 'list:string',
requires=IS_LIST_OF(IS_FLOAT_IN_RANGE(0, 1000000000), minimum=1),
filter_out=lambda floats: [float(f) for f in floats],
...)
以上将需要输入至少一个浮点值并拒绝任何非浮点字符串。从字段中选择数据时,字符串列表将自动转换为浮点列表。
注意,您还可以创建custom field type来处理DAL不支持的字段类型(即,您可以创建自己的list:float
自定义字段类型。)