I defined the following tables:

db.define_table('nav',
    Field('navbarID','reference 
navbar',default='',requires=IS_IN_DB(db,'navbar.id','%(name)s',zero=T('select 
a value')),notnull=True),
    
Field('name',length=32,default='',requires=[IS_LENGTH(32,error_message=T('length
 
exceeds 32 characters')),IS_NOT_EMPTY()],notnull=True),
    
Field('backendcontroller',length=32,default='',requires=IS_LENGTH(32,error_message=T('length
 
exceeds 32 characters'))),
    
Field('frontendcontroller',length=32,default='',requires=IS_LENGTH(32,error_message=T('length
 
exceeds 32 characters'))),
    
Field('function',length=32,default='',requires=[IS_LENGTH(32,error_message=T('length
 
exceeds 32 characters')),IS_NOT_EMPTY()],notnull=True),
    format='%(name)s',
    migrate=False)

db.define_table('nodeNav',
    Field('nodeID','reference node',**isnode),
    Field('navID','reference nav',default='',notnull=True'),
    Field('backend',type='boolean',default=False),
    Field('frontend',type='boolean',default=False),
    on_define=set_requirement,
    migrate=False)

Given the following records in nodeNav:

4    6    True    True
4    7    True    False
4    8    True    False
4    9    True    True

I'd like to create a form in which every record is a field, the name should 
be the navID, the label should be the name  in table nav, the field should 
be of type boolean and its value should be the value of frontend.

I thought of something like:

query=db((db.nodeNav.nodeID==4)&(db.nodeNav.navID==db.nav.id)&(db.nav.navbarID==3))
records=query.select(db.nodeNav.ALL,db.nav.ALL)
fields_list=[]
for r in records:
    
fields_list.append(Field(name=str(r.nav.id),type='boolean',default=r.nodeNav.frontend,label=r.nav.name))
form=SQLFORM.factory(*fields_list)
if form.process().accepted:
    records=query.select(db.nodeNav.ALL)
    for r in records:
        field=r.navID
        r.update_record(frontend=form.vars.field)
return dict(form=form)

Is this the way to go or is there a better way to implement this?

Kind regards,

Annet

-- 



Reply via email to