The SQLFORM options widget ignores the value in the database when editing the field. The following code shows the failure:
Model: db.define_table('product_types', Field('name', length=32, label='Type')) product_type_list = [r.name for r in db().select(db.product_types.name)] db.define_table( 'products', Field('name', length=256, required=True, notnull=True), Field('product_type', 'list:string'), format = '%(name)s', ) db.products.product_type.requires = IS_IN_SET(product_type_list, zero='Choice required') Controller: grid = SQLFORM.grid(...) return dict(grid=grid) To work around add something like this before the call to grid: if len(request.args)>2 and request.args[-3] == 'edit': product_type_value = db.products[request.args[-1]].product_type rows = db((db.product_types.is_active==True) & (db.product_types.tenant_link==session.auth.user.tenant_link) ).select(db.product_types.name) product_type_list = [r.name for r in rows] db.products.product_type.widget = lambda field,value: \ SELECT(product_type_list, value=product_type_value)