Hi there, The issue you have is that you are mixing a fully normalized solution and the web2py "short-cut".
In the table you have defined db.component_package_association.component_id as a single integer, but the validator is giving the field multiple values. The easy option is to delete the component_package_association table and have something like this: db.define_table('package', Field('components','list:reference component'), Field('another_field'), format='%(another_field)s' ) That way multiple references will be handled automatically in forms and they are transparent to the DAL. See the list_reference example in chapter 6 of the book. On Wednesday, December 10, 2014 5:50:42 AM UTC+13, Jan Beilicke wrote: > > > Hi everybody, > > since a couple of days I am trying to implement a *normalized > many-to-many model* that can be managed using a single form consisting of > a couple of fields from one table and a multiple select drop-down list > containing references to an intersection table. > > My problem is an exception that is thrown when the form is validated after > submit: > > int() argument must be a string or a number, not 'list' > > The exception is caused by a list of reference ids defined by selected > options in the drop-down list. > > A way to circument this exception might be to denormalize the intersection > table by using the field type list:reference which I want to avoid for > various reasons. > > I have created a similar model for demonstration purposes, where the > entity package has one or many components: > > db.define_table('component', > Field('some_field'), > format='%(some_field)s' > ) > > db.define_table('package', > Field('another_field'), > format='%(another_field)s' > ) > > db.define_table('component_package_association', > Field('component_id', 'reference component'), > Field('package_id', 'reference package')) > > db.component_package_association.component_id.requires = IS_IN_DB( > db, 'component.id', '%(some_field)s', multiple=True) > > And the controller: > > def manage_packages(): > if request.args(0) == 'new' and request.args(1) == 'package': > form = SQLFORM.factory(db.package, > db.component_package_association) > > if form.process().accepted: > # Code to store the new package and associations to > components > # ... > response.flash = 'Package successfully created.' > > content = form > else: > content = SQLFORM.grid(db.package) > > return dict(content=content) > > I did some research in the web2py-users ML and some search engines but > could not find a way to tackle this issue. > > Following a couple of ideas for which I am thankful to get helpful > comments and advice: > > 1. Create a custom validator for the form or > 2. Disable form.process().accepted or > 3. Disable the validation for the specific field > 4. Something completely different > > I try to avoid options 2 and 3. > > Thank you for your time! > > //jotbe > -- 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.