On Thursday, January 28, 2016 at 11:24:16 PM UTC-5, Dave wrote: > > Actually, maybe this is a bug. (or maybe just something that is not > supposed to work the way I am trying to use it...) > > If I turn off lazy_table support, everything works. I get a multi-select > box with the file_name populated (text area that I can multi-select). >
Actually, it is the reverse -- you get the multi-select box with lazy_tables=True, but not with lazy_tables=False. Here is how it works. The multi-select widget is generated automatically whenever a field has an IS_IN_DB(..., multiple=True) validator. Furthermore, list:reference fields automatically get an IS_IN_DB validator, but only when lazy_tables=True. The reason is that the IS_IN_DB validator is created when the auto_validators() function is called, and that function only assigns validators to reference fields if the referenced table name is in db.tables. Here is the order of operations in each case: lazy_tables=True: 1. At the end of db.define_table(), the new "tablename" is added to db.tables. 2. Sometime later, when db.tablename is accessed, the table is fully defined via db.lazy_define_table. 3. db.lazy_define_table calls auto_validators, which adds the IS_IN_DB validator because "tablename" is in db.tables (see #1). lazy_tables=False: 1. Before the end of db.define_table(), db.lazy_define_table is called (prior to the new "tablename" being added to db.tables). 2. db.lazy_define_table calls auto_validators, which does *not* add the IS_IN_DB validator because "tablename" is *not *yet in db.tables (see #1). I'm not sure I would call it a bug, but I think we may be able to adjust the code to make it work in either case (possibly by simply adding the new tablename to db.tables *before* db.lazy_define_table is called within db.define_table -- though I'm not sure if that will introduce some other problem). Maybe open a Github issue and link to this thread. If you do not want to use lazy tables, there is a simple workaround -- just explicitly define the validator yourself: Field('children', 'list:reference file_entry', requires=IS_IN_DB(db, 'file_entry.id', '%(file_name)s', multiple=True )) It appears you tried to do that, but you did not use the keyword argument "requires" and instead passed the validator as the third positional argument (which is actually the "length" argument). Note, the same issue exists with the default "represent" attribute of the list:reference field -- you will need to use lazy tables or otherwise explicitly specify that attribute as well. Anthony -- 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/d/optout.