I see what the problem is. The default widget overrides the validator.
Before we look for a solution let me undertand what you need.

The way you phrased looks like you want users to input the IDs of the
tags. I suspect you want instead the user to insert tag names, perhaps
comma separated, and you want the system to parse them and store the
corresponding ids in the product.tags field. Is this correct?

massimo

On Jul 23, 2:52 am, Iceberg <[email protected]> wrote:
> Hi Massimo,
>
> How to add a IS_NOT_EMPTY constrait to list:reference field? This
> seems a simple task but I ends up opening a can of worms. :-/  Here is
> what I did.
>
> 1. Firstly, setup the sandbox.
>
>     db.define_table('tag',
>         Field('name', requires=IS_NOT_EMPTY()), format='%(name)s')
>     db.define_table('product',
>         Field('name', requires=IS_NOT_EMPTY()),
>         Field('tags', 'list:reference tag'),)
>
>     def product():
>         return {
>             1: crud.update(db.product, request.args(0)),
>             2: crud.select(db.product),
>             }
>
> Now we can add new product with or without tags. Fine.
>
> 2. What if we need new product to have at least one tag?
>
> I tried changing the tags field definition into (I thought it was
> intuitive):
>
>     Field('tags', 'list:reference tag', required=True)
>
> But nothing different. I can't force a tag.
>
> 3. Then I tried to change tags into:
>
>     Field('tags','list:reference tag',
>         requires =
> IS_IN_DB(db,'tag.id',db.tag._format,multiple=True),),
>
> This is the so-called default constraint, according to the book,
> chapter 6.
> But situation gets worse. Now I get error ticket whenever submitting
> new product.
>
> 4. I even tried:
>
>     requires = [IS_NOT_EMPTY(), IS_IN_DB(...)]
>
> still tickets.
>
> Problem persists in both web2py 1.95.1 and 1.97.1, on Windows.
>
> Did I miss something really obvious? Thanks in advance.
>
> Regards,
> Ray (a.k.a. Iceberg)

Reply via email to