The easiest way to do that is rely on web2py model -> form transformation and use a validator (instead of the custom form).
model ------------------------------------------ MY_OPTIONS = ["a","b","c"] db.define_table("my_table", db.Field("my_options", "list:string", default=MY_OPTIONS)) db.my_table.my_options.widget = SQLFORM.widgets.checkboxes.widget db.my_table.my_options.requires = [IS_IN_SET(MY_OPTIONS, multiple=True), IS_NOT_EMPTY()] controller ------------------------------------------ def my_function(): if len(request.args): form=SQLFORM(db.my_table, request.args[0]) else: form=SQLFORM(db.my_table) if form.accepts(request.vars): redirect(URL(r=request, f='my_next_function', args=[form.vars.id])) return {"form":form}