This is probably the easiest way to go. You could use a computed field, but then if you want the computed field to appear in an update form, you have to explicitly list it (along with all fields you want to appear). Note, if you instead used request.vars.to to set the field default, that wouldn't present any danger in terms of the contents of request.vars.to not being validated, because you're only using the length of request.vars.to. It would only be an issue if the validation of request.vars.to could result in it passing validation but its length changing as a result of that.
Anthony On Wednesday, October 26, 2011 6:39:29 AM UTC-4, Archibald Linx wrote: > > Thank you Anthony. > > I will need to exclusively modify the variable "status" on other > occasions. So I am not sure I really want "computed fields". Is that > true ? > > So I decided to try an onvalidation function and I ended up with : > > def status(form): > form.vars.status = [0]*len(form.vars.to) > > def write(): > form = SQLFORM(db.message) > if form.accepts(request.vars, session, onvalidation=status): > response.flash = 'Got it' > > It seems to work. > > Is it ok ? If I have understood correctly, onvalidation is called > after validation and before insert. Like this I am sure > "forms.vars.to" does not contain anything fishy or dangerous. > > Thanks, > Archibald > > > On 25 oct, 18:30, Anthony <[email protected]> wrote: > > On Tuesday, October 25, 2011 11:45:41 AM UTC-4, Archibald Linx wrote: > > > > > Thank you Anthony. > > > > > All this works very nicely. > > > Maybe the default format for auth_user should also be documented. > > > > > Let's say I have the following table : > > > db.define_table('message', > > > Field('to', 'list:reference auth_user'), > > > Field('status', 'list:integer')) > > > > > I want "status" to be a list of 0 as long as "to", but > > > "db.message.status.default = [0]*len(db.message.to.default)" does not > > > work. > > > > db.message.to.default represents the default value for the 'to' field > (which > > you have not set), not the actually values being inserted. Anyway, I > don't > > think the default for one field can reference the values of another. > > > > There are a few other options. You could use a computed field (though by > > default that won't display in a form, if you need that). If > inserts/updates > > will always be handled via form submissions, you could us a form > > onvalidation function or a custom validator. You could also just do > > default=[0]*len(request.vars.to), since upon form submission, the > values > > submitted to the 'to' field will be stored in request.vars.to (note, > the > > values stored in request.vars will be the unvalidated values). See here > for > > more > > details: > http://stackoverflow.com/questions/7325776/using-a-lambda-for-a-model... > > > > Anthony

