Thanks all, got it working. One correction from the code offered: db.employee.supervisor_id.represent = lambda row: get_name(row.supervisor_id)
should be: db.employee.supervisor_id.represent = lambda val, row: get_name(row.supervisor_id) Thanks again. -Jim On Wednesday, November 21, 2012 3:35:39 PM UTC-6, Jim S wrote: > > Thanks Anthony. I will proceed with that route. > > -Jim > > > On Wednesday, November 21, 2012 3:04:25 PM UTC-6, Anthony wrote: >> >> The problem is that unlike departmentId, supervisorId is a self >> reference. With a non-self-reference field, the DAL will automatically set >> the "represent" attribute to be the _format attribute of the referenced >> table, but that is not possible with a self reference because the >> referenced table does not yet exist at the time the field is created. I >> think you'll have to set the represent attribute separately in this case. >> >> Anthony >> >> On Wednesday, November 21, 2012 3:49:15 PM UTC-5, Jim S wrote: >>> >>> Yes, I know I can do that, but seems like this should be the default >>> behavior for web2py. I'm just looking for it to work the same way the >>> other reference fields work (see the departmentId field in my example). >>> >>> -Jim >>> >>> On Wednesday, November 21, 2012 1:59:22 PM UTC-6, Cliff Kachinske wrote: >>>> >>>> In your controller do something like >>>> def get_name(id): >>>> record = db(db.employees.id==id).select(db.employees.first_name, db. >>>> employees.last_name).first() >>>> return ' %s %s' %(record.first_name, record.last_name) >>>> >>>> db.employee.supervisor_id.represent = lambda row: get_name(row. >>>> supervisor_id) >>>> >>>> If it's an index list you will get one database hit per row. Better to >>>> use this trick on the edit or view pages. >>>> >>>> >>>> On Wednesday, November 21, 2012 2:32:54 PM UTC-5, Jim S wrote: >>>>> >>>>> I have a table defined as follows: >>>>> >>>>> employee = db.define_table('employee', >>>>> Field('employeeId', 'id', writable=False, label='Employee #'), >>>>> Field('firstName', length=25, required=True, label='First Name', >>>>> writable=False), >>>>> Field('lastName', length=25, required=True, label='Last Name', >>>>> writable=False), >>>>> ... >>>>> Field('departmentId', db.department, label='Department', writable= >>>>> False), >>>>> Field('supervisorId', 'reference employee', label='Supervisor',writable >>>>> =False), >>>>> format='%(lastName)s, %(firstName)s') >>>>> >>>>> db.employee.dob.requires = IS_NULL_OR(IS_DATE('%m/%d/%Y')) >>>>> db.employee.seniorityDate.requires = IS_NULL_OR(IS_DATE('%m/%d/%Y')) >>>>> db.employee.hireDate.requires = IS_NULL_OR(IS_DATE('%m/%d/%Y')) >>>>> db.employee.originalHireDate.requires = IS_NULL_OR(IS_DATE('%m/%d/%Y' >>>>> )) >>>>> db.employee.terminationDate.requires = IS_NULL_OR(IS_DATE('%m/%d/%Y')) >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> My supervisorId field displays correctly with the dropdown if it is >>>>> writable, but when I set writable=False it just displays the value of the >>>>> supervisorId field, not the assosiated employee first/last name as the >>>>> format would dictate. departmentId is setup to behave the same way, just >>>>> referencing a different table and it displays the proper 'name' of the >>>>> department when writable=False instead of the id field like supervisorId >>>>> does. Is this a bug? >>>>> >>>>> -Jim >>>>> >>>> --