A little more progress -- hopefully to help someone else that Googles for 
this and ends up stumped like I was...  I've spent an inordinate amount of 
time and frustration figuring out little nuances that I wouldn't wish upon 
anyone...   

Gotca's that I learned:

1) To hide a field, first remove it from the fields to be shown in the 
SQLFORM, then add it back with the hidden= attribute.  Just specifying it 
as hidden does not remove it.

i.e. This does NOT work, the field 'hidden' is shown to the user:
db.define_table('person',
               Field('name', 'string'),
               Field('hidden', 'string'))

def index():
   form = SQLFORM(db.person, hidden=dict(hidden="Default hidden text"))

    form.vars.hidden = request.vars.
   

This DOES work:

db.define_table('person',
              Field('name', 'string'),
              Field('hidden', 'string'))

def index():
  form = SQLFORM(db.person, fields=['name'], hidden=dict(hidden="Default 
hidden text"))

    form.vars.hidden = request.vars.


2) To get a list of fields to show (from a larger table definition, so as 
to not hand-type each field name), you must get a copy of the fields from 
the table object, not just a reference to the fields.

i.e. This DOES NOT work.  The field will be be removed and unseen by the 
user, however since Python works by reference, the field is removed from 
the table definition and the form.accepted() will fail as web2py will try 
to insert a value into field that no longer exists.

db.define_table('person',
              Field('name', 'string'),
              Field('hidden', 'string'))

def index():

  fields_to_show = db.person.fields
  fields_to_show.remove('hidden')

  form = SQLFORM(db.person, fields= fields_to_show, hidden=dict(hidden="Default 
hidden text"))



    form.vars.hidden = request.vars.Enter code here...

This DOES work (only 3 characters difference) - making a copy of the fields 
list instead of getting it by reference:

db.define_table('person',
              Field('name', 'string'),
              Field('hidden', 'string'))

def index():

  fields_to_show = db.person.fields*[:]*
  fields_to_show.remove('hidden')

  form = SQLFORM(db.person, fields= fields_to_show, hidden=dict(hidden="Default 
hidden text"))



    form.vars.hidden = request.vars.Enter code here...


3. To update the value of the hidden fields (or any fields), the form.vars 
modification must be before the form.process call.

i.e. This DOES NOT work.

db.define_table('person',
                Field('name', 'string'),
                Field('hidden', 'string'))

def index():
    form = SQLFORM(db.person, fields=['name'], hidden=dict(hidden="Default 
hidden text"))

    form.vars.hidden = request.vars.
    
    if form.process(onvalidation=validate_form).accepted:
        pass

    return dict(form=form)

def validate_form(form):

    *form.vars.hidden = "Changed hidden text"   #Never gets written to 
database*
    form.accepted = True

This does work:

db.define_table('person',
                Field('name', 'string'),
                Field('hidden', 'string'))

def index():
    form = SQLFORM(db.person, fields=['name'], hidden=dict(hidden="Default 
hidden text"))

    form.vars.hidden = request.vars.

    *form.vars.hidden = "Changed hidden text"   #Successfully written to 
database*
    
    if form.process(onvalidation=validate_form).accepted:
        pass

    return dict(form=form)

def validate_form(form):

    form.accepted = True

Take care...


-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to