yep, this kind of thing is easily accomplishable with components.
A more tight control on what happens with javascript would be needed to make the code less verbose, but is doable nonetheless with the current toolset in web2py.
I'm working in the tighter integration but it may take some time (see the post "no more inline javascript").
Let's take invoices as an example (usually "normalized" in "header" and "details" fields)
There are many ways to accomplish such a thing from the "architectural" standpoint....
You can generate on-the-fly (factory) a single huge form with fields like
detail_1_field1
detail_1_field2
....
detail_2_field1
detail_2_field2
and do your own dbio, all in one transaction.
An acceptable one can be very well be a "please fill the invoice header", save that one in the headers table and then prepare some "details" forms (one for each row of the "details" table).
There would be a "add detail" button that prepares another insert form for the subsequent detail and a "confirm this invoice" button that prevents any other addition and "freezes" the invoice as it is from further edits, e.g. turning a flag on the "headers" table (so you can distinguish in your code between "drafts" and "real" invoices).
The first method can be more correct from the "acid" standpoint but the second can, e.g. accumulate statistics on what users do in their drafts ..... it's all a matter of what your app needs to do.