Case closed.

After doing something else all day, the answer came to me ...

Change the controller to this:
# find the id of dogs, if any, that already belong to the owner
            rows =
db(db.dog_owner.owner_id==request.args[-3]).select(
                db.dog_owner.dog_id
            )
# if there are such, build a list
            if len(rows) > 0:
                avoid = []
                [avoid.append(row.dog_id) for row in rows]
                query = ~(db.dog.id.belongs(avoid))
                db.dog_owner.dog_id.requires = IS_IN_DB(
                   db(query), 'dog.id', '%(dog_name)s',
                   zero = 'Choose'
                )


On Jan 3, 7:58 am, Cliff <[email protected]> wrote:
> I am trying to keep smartgrid from creating duplicate rows in a
> linking table, but it isn't working.
>
> Here is what I'm trying to do, but it isn't working.
>
> Any suggestions?
>
> Model:
> db.define_table('dog',
>                 Field('dog_name', length=32),
>                 auth.signature,
>                 format='%(dog_name)s',
>                 singular = 'Dog',
>                 plural = 'Dogs',
>                )
>
> db.define_table('owner',
>                 Field('name', length=32),
>                 auth.signature,
>                 format = '%(name)s',
>                )
>
> db.define_table('dog_owner',
>                 Field('dog_id', db.dog),
>                 Field('owner_id', db.owner),
>                )
>
> db.dog_owner.dog_id.requires=IS_IN_DB(
>     db, 'dog.id', '%(dog_name)s',
>     zero='Choose'
> )
> db.dog_owner.owner_id.requires=IS_IN_DB(
>     db, 'owner.id', '%(name)s',
>     zero='Choose',
> )
>
> ++++++++++++++++++++++++++++++++++++++++++++++
> Controller code intended to avoid duplicates:
> ++++++++++++++++++++++++++++++++++++++++++++++
> # creating a new row in the dog_owner table
>     for arg in request.args:
>         if '.' in arg and 'new' in request.args:
>
> # find the id of dogs, if any, that already belong to the owner
>             rows = db(db.dog_owner.owner_id==request.args[-3]).select(
>                 db.dog_owner.dog_id
>             )
>
> # if there are such, build a list
>             if len(rows) > 0:
>                 avoid = []
>                 [avoid.append(row.dog_id) for row in rows]
>                 constraints = {'dog': ~(db.dog.id.belongs(avoid)) }
>
> # also tried simple constraints such as this:
> # {'dog': db.dog.id < 5}
>
> # the dog pulldown still displays all the dogs in the db
> # thereby allowing the user to create duplicate rows in dog_owner
> # how can I fix this?
>     form = SQLFORM.smartgrid(
>         db.owner,
>         ui='jquery-ui',
>         onupdate=lambda form: auth.archive(
>             form,
>             archive_current=False
>         ),
>         constraints=constraints
>     )

Reply via email to