I have a couple of ideas, but none are tested First, can you try adding the field_id parameter to your SQLFORM.grid() call? I believe that tells this grid which is your 'primary' table.
Secondly (this is the way I typically handle it) - instead of coding everything in a lambda, call a function to build your buttons and just pass it the id of the row. Then, in your function you can retrieve the entire row and get all the data you need even if it isn't included in the grid fields. Not sure that completely addresses your concern, but if you run through those ideas it might help you onto a solution. -Jim On Wednesday, October 7, 2020 at 1:44:41 PM UTC-5, Vlad wrote: > > Seems to me this is an inconsistency in the way how grid operates (which > breaks it, as I show below, but, of course, most probably I am just missing > something.) > > The following code crashes: > > query = db.cart > fields = [db.cart.id] > links = [dict(header='View', body=lambda row: str(*row.cart.id > <http://row.cart.id>*))] > grid = SQLFORM.grid(query, editable=True, details=True, links=links, > fields=fields) > > This is because row.cart is undefined in the links. Instead, the links > should be made as such: > > links = [dict(header='View', body=lambda row: str(*row.id > <http://row.id>*))] > > Now this works. > > However, when I add more fields in the code, like this: > > fields = [db.cart.id, db.cart.description, db.cart_ownership.boss, > db.cart_ownership.status, db.cart.count] > > Now in the links I can't use "row.id". It must be "row.cart.id" > > This by itself would be fine, I could just use *row.id <http://row.id>* > or *row.card.id <http://row.card.id>* accordingly, depending on the > fields used (though I would like to control this structure), but I am > having the following problem further on: > > The grid described by the code > > query = db.cart > fields = [db.cart.id, db.cart.description, db.cart_ownership.boss, > db.cart_ownership.status, db.cart.count] > links = [dict(header='View', body=lambda row: str(row.cart.id))] > grid = SQLFORM.grid(query, editable=True, details=True, links=links, > fields=fields) > > crashes when I try to view or edit a row of the grid. This is because the > links takes row.cart.id in the grid itself, but expects row.id in edit- > or view- actions (i.e. when editing or viewing a row). When viewing or > editing a row, row.cart is undefined in the links, so row.cart.id crashes > it (when "view" or "edit" buttons are clicked), while in the grid itself > row.cart.id works just fine (and row.id would not work). > > What am I missing here? How do I control how this field should be expected > in the links in the grid vs. in the view/edit a row of the grid? > > Here is still simplified but more complete code, in case I missed > something important in a "shortcut" code above: > > query = db.cart > fields = [db.cart.id, db.cart.description, db.cart_ownership.boss, > db.cart_ownership.status, db.cart.count] > links = [dict(header='View', body=lambda row: str(row.cart.id))] > grid = SQLFORM.grid(query, > editable=True, > details=True, > links=links, > fields=fields, > left = [db.cart_ownership.on(db.cart.id > ==db.cart_ownership.cart)], > field_id=db.cart.id, > ) > > -- 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]. To view this discussion on the web visit https://groups.google.com/d/msgid/web2py/257aa85d-41f2-4b2e-a59a-bd1980c83efco%40googlegroups.com.

