Hi,

thanks for your remark. I try to avoid the simple option using 
list:reference as mentioned above in favor of normalization. :)

Am Dienstag, 9. Dezember 2014 21:19:28 UTC+1 schrieb Limedrop:
>
> 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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to