Thanks Denes. I was hoping to use onvalidation for all of my validation logic to keep it centralized since I'm using crud. What about making it configurable by adding 'always_validate=False' ?
On Nov 26, 9:19 pm, DenesL <[email protected]> wrote: > You can always change requires on the fly > > def test(): > if request.vars.year: > try: > y = int(request.vars.year) > except 'ValueError': > y = 0 > if y > 1975: > db.cars.catalytic_converter_type.requires = > IS_IN_SET(['one','two','three'], error_message='cars later than 1975 > must have at least one') > else: > db.cars.catalytic_converter_type.requires = IS_EQUAL_TO('', > error_message='cars before 1975 should not have one') > f=SQLFORM(db.cars) > if f.accepts(request.vars, session): > response.flash='accepted' > elif f.errors: > response.flash='please fix and re-submit' > return dict(f=f) > > On Nov 26, 7:17 pm, "mr.freeze" <[email protected]> wrote: > > > Good point. Here is my use case: > > > db.define_table('cars', > > Field('make'), > > Field('model'), > > Field('year'), > > Field('catalytic_converter_type',requires = > > IS_IN_SET('one','two','three'), > > comment='for cars later than 1975')) > > > I want catalytic_converter_type to be required if the car year is > > greater than 1975. I also want to show an error if > > catalytic_converter_type is selected and the year is less than 1975. > > Allowing the user to see all errors at once would be a bonus but not a > > deal breaker. onvalidation seems like the place to handle it but let > > me know if there is a better way. > > > On Nov 26, 5:48 pm, mdipierro <[email protected]> wrote: > > > > Consider this case: > > > > db.define_table('numbers',Field('a','integre'),Field('b','integer')) > > > def validate(form): > > > if form.vars.a+form.vars.b>100: > > > form.errors.b="a+b must not exceed 100" > > > form=crud.create(db.numbers,onvalidation=validate) > > > > Before the change the function validate is not called if a and b are > > > not valid integer this never triggering an exception, only validation > > > errors. > > > > With your proposed change this would cause an error because > > > form.vars.a is None if request.vars.a does ot pass the default integer > > > validation. The function validation would be called again and issue a > > > ticket. > > > > This is a change of behavior. I am not convinced this change is a good > > > idea. > > > > Why do you need it? > > > Other opinions? > > > > Massimo > > > > On Nov 26, 11:34 am, "mr.freeze" <[email protected]> wrote: > > > > > Changing line 1565 of html.py from... > > > > if status and onvalidation: > > > > to... > > > > if vars and onvalidation: > > > > > On Nov 26, 11:28 am, mdipierro <[email protected]> wrote: > > > > > > What would you suggest? > > > > > > On Nov 26, 11:10 am, "mr.freeze" <[email protected]> wrote: > > > > > > > I see two issues with this: > > > > > > 1) The form errors found in onvalidation will not be displayed if > > > > > > there are already form errors > > > > > > 2) The developer never gets a chance to remove form errors for > > > > > > certain > > > > > > conditions (think contingent form fields) > > > > > > For example, I am using IS_IN_DB on a field but I only want it to be > > > > > > required if another field is a certain value. > > > > > > > Is there a better way? > >

