Se anche voi sviluppate in Python usando web2py, vi potrebbe capitare di voler aggiornare due o più tabelle del database utilizzando un singolo form all’interno di una vista.
La prima cosa che verrebbe in mente sarebbe quella di utilizzare SQLFORM oppure SQLFORM.factory perché sul libro mastro c’è un esempio
dettagliato su come inserire i record in più tabelle usando questi operatori. Quello che il manuale non dice è che funzionano soltanto per l’inserimento.
La seconda cosa da provare è una ricerca nella mailing-list web2py-users dove scoprirete che altri derelitti prima di voi sono incappati
nello stesso problema.
Alcune risposte propongono di specificare l’id del record da aggiornare all’interno dell’operatore SQLFORM.factory, in questo modo: SQLFORM.factory(db.tabella1,db.tabella2,record=id_del_record), non perdete tempo a provare, non funziona. E tantomeno funziona questo: SQLFORM.factory(db.tabella1,db.tabella2,id_del_record).
Per farla breve, ad oggi Febbraio 2015, esiste un’unica soluzione funzionante, indicata dallo stesso Massimo di Pierro nel lontano 2008 sulla mailing list web2py-users:
You have the option of using form=SQLFORM and then form[0].insert(2,TR (...)) the rows from the other table. It may be easier to create the form using form_factory. Massimo
In parole povere, ad oggi Febbraio 2015, non c’è una reale soluzione e bisogna fare a manazza.
Ci sono due possibilità:
utilizzare SQLFORM per costruire il form della prima tabella e poi iniettare i campi delle altre tabelle nel form, oppure costruire tutto il form a mano usando form.factory. Dopodiché bisognerà gestire manualmente, dopo l’invio del form, l’aggiornamento/cancellazione dei record provenienti dalle altre tabelle correlate.
Dovendo inseire solamente un campo in più da un’altra tabella, ho scelto la prima opzione: