I want to be able to flag to the user that certain input fields are 'Required' (even before they hit 'Submit' & see the form failing to validate)
To do this I decided to try & create a widget that would append to the normal INPUT box a SPAN(_class="req"). I can then use CSS/JS to populate that span with a red asterisk (but keep it cutomisable by designers, if they wish). I followed the instructions here: http://mdp.cti.depaul.edu/AlterEgo/default/show/170 Copying the default from sqlhtml.py +125, I added this widget to my customised T2 class: def input_required_widget(field,value): items=[DIV(INPUT(_type='text', _id=field_id,_class=field.type,_name=fieldname,value=str (default),requires=field.requires),SPAN(_class='req'))] return DIV(*items) I then added this to my model: db.cr_shelter.name.widget=t2.input_required_widget This gives the following error: Traceback (most recent call last): File "C:\Bin\web2py\gluon\restricted.py", line 62, in restricted exec ccode in environment File "C:\Bin\web2py\applications\sahana/controllers/cr.py", line 78, in <module> File "C:\Bin\web2py\gluon\globals.py", line 55, in <lambda> self._caller=lambda f: f() File "C:\Bin\web2py\applications\sahana/controllers/cr.py", line 40, in add_shelter form=t2.create(db.cr_shelter) File "C:\Bin\web2py\applications\sahana\modules\t2.py", line 414, in create showid=False,col3=col3,_class='t2-create') File "C:\Bin\web2py\gluon\sqlhtml.py", line 89, in __init__ inp=field.widget(field,default) TypeError: input_required_widget() takes exactly 2 arguments (3 given) I searched around to see if there were other docs & found this: http://groups.google.com/group/web2py/browse_thread/thread/961d4303a7549241/a9d19abdfa4b6a07 I tried bypassing the module & just put in a simple: db.cr_shelter.name.widget=lambda self,value: DIV(INPUT (_type='text'),SPAN(_class='req')) This displays correctly, but doesn't allow entered data to get stored in the db, presumably because the id isn't set on the field. I tried to add all the fields in: db.cr_shelter.name.widget=lambda self,value: DIV(INPUT(_type='text', _id=field_id,_class=field.type,_name=fieldname,value=str (default),requires=field.requires),SPAN(_class='req')) But then I get a scope problem: Traceback (most recent call last): File "C:\Bin\web2py\gluon\restricted.py", line 62, in restricted exec ccode in environment File "C:\Bin\web2py\applications\sahana/controllers/cr.py", line 78, in <module> File "C:\Bin\web2py\gluon\globals.py", line 55, in <lambda> self._caller=lambda f: f() File "C:\Bin\web2py\applications\sahana/controllers/cr.py", line 40, in add_shelter form=t2.create(db.cr_shelter) File "C:\Bin\web2py\applications\sahana\modules\t2.py", line 414, in create showid=False,col3=col3,_class='t2-create') File "C:\Bin\web2py\gluon\sqlhtml.py", line 89, in __init__ inp=field.widget(field,default) File "C:\Bin\web2py\applications\sahana/models/db.py", line 517, in <lambda> db.cr_shelter.name.widget=lambda self,value: DIV(INPUT (_type='text', _id=field_id,_class=field.type,_name=fieldname,value=str (default),requires=field.requires),SPAN(_class='req')) NameError: global name 'field_id' is not defined I changed my model to: db.cr_shelter.name.widget=lambda self,value: t2.input_required_widget This gives no traceback, but instead of an INPUT box, I get the following: <bound method T2SAHANA.input_required_widget of <applications.sahana.modules.sahana.T2SAHANA instance at 0x04291698>> Trying: db.cr_shelter.name.widget=lambda self,value: t2.input_required_widget ('name') I'm back to the scope issue: Traceback (most recent call last): File "C:\Bin\web2py\gluon\restricted.py", line 62, in restricted exec ccode in environment File "C:\Bin\web2py\applications\sahana/controllers/cr.py", line 78, in <module> File "C:\Bin\web2py\gluon\globals.py", line 55, in <lambda> self._caller=lambda f: f() File "C:\Bin\web2py\applications\sahana/controllers/cr.py", line 40, in add_shelter form=t2.create(db.cr_shelter) File "C:\Bin\web2py\applications\sahana\modules\t2.py", line 414, in create showid=False,col3=col3,_class='t2-create') File "C:\Bin\web2py\gluon\sqlhtml.py", line 89, in __init__ inp=field.widget(field,default) File "C:\Bin\web2py\applications\sahana/models/db.py", line 520, in <lambda> db.cr_shelter.name.widget=lambda self,value: t2.input_required_widget('name') File "C:\Bin\web2py\applications\sahana\modules\sahana.py", line 163, in input_required_widget NameError: global name 'field_id' is not defined This also happens even if I remove that global from my widget def: items=[DIV(INPUT (_type='text',_class=field.type,_name=field.name,value=value,requires=field.requires),SPAN (_class='req'))] I'm not sure why there's a scope issue since my custom T2 has this line: from gluon.sqlhtml import * Searching some more: http://groups.google.com/group/web2py/browse_thread/thread/8f4ac3eb42b599f2/692bef480d3d5df9 I tried this: db.cr_shelter.name.widget=lambda a,b: t2.input_required_widget(a,b, ['name']) No joy: TypeError: input_required_widget() takes exactly 2 arguments (4 given) I see that this widget has 3 arguments in it's def: (self,value,tags= []) Since we only have 2, I tried: db.cr_shelter.name.widget=lambda self,value: t2.input_required_widget (self,value) No joy: TypeError: input_required_widget() takes exactly 2 arguments (3 given) Going back to trying to fix the scope, I tried having this in the widget def: _id=gluon.sqlhtml.field_id No joy: NameError: global name 'field_id' is not defined Trying to see how T2's widgets deal with this I tried adding this to the widget def: field_id=self._tablename+'_'+self.name No joy: NameError: global name 'field_id' is not defined I really need a helping hand here ;) Many thanks, Fran. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---

