This got solved by using the fact that Field.default could be manipulated *after* the Field has been created (following the above line of examples):
def build_form(readonly=False): #create fields or get from db field1=Field('test') field2=db.my_table.best #set defaults field1.default='abc' field2.default='123' #give it to the form form = SQLFORM.factory( *[field1, field2], readonly=readonly ) def frm(): form = build_form( readonly=True ) return dict(form=form) So readonly=True and no need of form.accepts. The lesson (if I am still not missing something) - if you want to reuse a SQLFORM.factory form and make it readonly set the defaults using Field.default and not Form.vars. Verrrrry particular...