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.