I think the solution may be changing the OptionsWidget validator. I will work on it. If you have any advice, let me know.
On Jun 21, 5:12 am, DenesL <denes1...@yahoo.ca> wrote: > On Jun 20, 11:23 pm, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > The code you have below works fine. I guess the question is how to do > > IS_IN_DB and IS_NOT_IN_DB at the same time for the same field. Is that > > the question? > > Yes, that is the question. > Sorry, it was not stated explicitly. > > On Jun 21, 12:36 am, mdipierro <mdipie...@cs.depaul.edu> wrote: > > > > > Correction! > > > It can be done but in two steps: > > > db.define_table('person',SQLField('name')) > > db.define_table('project',SQLField('name')) > > db.define_table('relation', > > SQLField('person_id','reference person'), > > SQLField('project_id','reference project')) > > db.relation.person_id.requires=IS_IN_DB(db,db.person.id,'%(name)s') > > db.relation.project_id.requires=[IS_IN_DB(db,db.project.id,'%(name) > > s'), > > IS_NOT_IN_DB(db > > (db.relation.person_id==request.vars.person_id),db.relation.project_id)] > > > because the last line sets 2 validators, there is no automatic > > dropbox. It must be added via a widget with a trick (clone the field) > > > from gluon.html import OptionsWidget > > from gluon.sqlhtml import OptionsWidget > > > db.relation.project_id.widget=lambda f,v: OptionsWidget.widget(SQLField > > ('project_id',db.project,requires=db.relation.project_id.requires > > [0]),v) > > Even with the correct import I get: > > Traceback (most recent call last): > File "C:\web2py\trunk\gluon\restricted.py", line 107, in restricted > exec ccode in environment > File "C:/web2py/trunk/applications/a1/controllers/default.py", line > 92, in <module> > File "C:\web2py\trunk\gluon\globals.py", line 100, in <lambda> > self._caller = lambda f: f() > File "C:/web2py/trunk/applications/a1/controllers/default.py", line > 74, in add_relation > form=SQLFORM(db.relation) > File "C:\web2py\trunk\gluon\sqlhtml.py", line 509, in __init__ > inp = field.widget(field, default) > File "C:/web2py/trunk/applications/a1/controllers/default.py", line > 58, in <lambda> > db.relation.project_id.widget=lambda f,v: OptionsWidget.widget > (SQLField > ('project_id',db.project,requires=db.relation.project_id.requires > [0]),v) > File "C:\web2py\trunk\gluon\sqlhtml.py", line 181, in widget > attr = OptionsWidget._attributes(field, default, **attributes) > File "C:\web2py\trunk\gluon\sqlhtml.py", line 48, in _attributes > _id = '%s_%s' % (field._tablename, field.name), > AttributeError: 'SQLField' object has no attribute '_tablename' > > I feel that the problem lies in the dual functionality of the > requires. > It is used both as a widget source and as a validator (its intended > purpose). > I also tried defining the widget based on the IS_IN_DB validator and > then changing the requires to IS_NOT_IN_DB on the fly in the > controller but the widget keeps the original requires and the form > field is created with it so IS_NOT_IN_DB is never used. > You can probably go in and change the requires in the form but this is > getting needlessly complex. > > > > > This should work but I will make it easier and more intuitive. > > It is in your hands master ;-) > > Denes. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" group. To post to this group, send email to web2py@googlegroups.com To unsubscribe from this group, send email to web2py+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---