You should probably make it a reference field. By default, if you don't 
specify any "requires", you'll automatically get an IS_IN_DB validator as 
well as a "represent" attribute that displays whatever is specifying by the 
"format" attribute of the referenced table. However, if you specify your 
own validator(s), then you don't get any default "represent" -- so just add 
your own explicit represent:

db.define_table('dog',
    Field <http://127.0.0.1:8000/examples/global/vars/Field>('name'), 
    Field <http://127.0.0.1:8000/examples/global/vars/Field>('owner', db.
person, 
requires=IS_EMPTY_OR<http://127.0.0.1:8000/examples/global/vars/IS_EMPTY_OR>
(IS_IN_DB <http://127.0.0.1:8000/examples/global/vars/IS_IN_DB>(db, 
'person.id', '%(name)')),
          represent=lambda id, row: db.person(id).name),
    format = '%(name)s')

Anthony

On Tuesday, July 17, 2012 10:26:52 AM UTC-4, joe wrote:
>
> Is there any way to make a field in a form referencing a foreign key null, 
> while storing a foreign key as a foreign key, but making dropdowns 
> corrospond to the format.  Here is my example:
>
> Model:
>
> db = DAL 
> <http://127.0.0.1:8000/examples/global/vars/DAL>('sqlite://storage.sqlite')
>
> db.define_table('person',
>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('name'),
>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('email'),
>     format = '%(name)s')
>     
> db.define_table('dog',
>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('name'), 
>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('owner', 
> requires = IS_EMPTY_OR 
> <http://127.0.0.1:8000/examples/global/vars/IS_EMPTY_OR>(IS_IN_DB 
> <http://127.0.0.1:8000/examples/global/vars/IS_IN_DB>(db,db.person))), #I 
> have also tried default=None, and required = False, no difference
>     format = '%(name)s')
>
>
> Controller:
>
> *from gluon.tools import Crud
> crud = Crud(db)
>
> def index():
>     form = SQLFORM(db.person)
>     if form.process().accepted:
>         response.flash = 'success'
>     return dict(form=form)
>     
> def add_dog():    
>     form = SQLFORM(db.dog)
>     if form.process().accepted:
>         response.flash = 'success'
>     return dict(form=form)
>
> def view():
>     grid = SQLFORM.smartgrid(db.dog)
>     grid2 = crud.select(db.person)
>     return dict(grid=grid, grid2=grid2)
> *
>
> *
> *
>
> When I have the above code, a foreign key will be stored in the database, but 
> all views of that key will be rendered as the numerical value of the foreign 
> key, and not the name.  In the table definition, if I just have *db.person* 
> instead of requires = *IS_EMPTY_OR*(*IS_IN_DB*(db,db.person)), It requires 
> the field.  
>
>
> Are there any workarounds?
>
> -Joe Peacock
>
>

-- 



Reply via email to