Miii quante domande
Che io sappia non è possibile combinare t-if e t-foreach ... il tuo approccio oltretutto mi sembra oltre che corretto di facile lettura e chiaro su cosa vuoi ottenere. Io anche se fosse disponibile quel costrutto non lo userei nel caso da te proposto.
Per quando riguarda il controllo su "FALSE" (un casino che storicamente ha fatto odoo mischiando in molti casi valore booleano FALSE a valore nullo NONE) il recordset o.picking_ids esiste ma ha 0 elementi.
Fare un controllo su FALSE (vedi nota sul casino di odoo di cui sopra) sarebbe sbagliato per due motivi:
1) o.picking_ids potrebbe non essere stato settato ed in quel caso dovrebbe essere NONE
2) o.picking_ids è settato ma ha valore zero elementi quindi non sarebbe "FALSE"
In ogni caso, anche se odoo spesso lo fa, o.picking_ids dovrebbe assumere il valore NONE oppure istanza di recordset.
Nelle verifiche (if ad esempio) python considera FALSE un insieme di valori oltre al semplice FALSE booleano.
ES:
lista = []
if lista:
print('TRUE')
else:
print('FALSE')
Darà come risultato FALSE
Ma se faccio
if lista == None:
print('TRUE')
else.
print('FALSE')
Otterrai ancora una volta FALSE
Ma se fai
if lista != NONE:
print('TRUE)
else:
print('FALSE')
Otterrai TRUE
Tutto questo per dire che nelle verifiche dirette una lista (ed anche un recordset odoo) viene considerata FALSE se non ha elementi ma in effetti il suo valore non è ne FALSE (booleano) ne NONE (puntatore non valorizzato) ma un oggetto di lunghezza 0.
Se fai un controllo con il booleano FALSE il test fallirà sempre perchè lista (o recordset) non saranno mai FALSE booleano ...
Questo in teoria e su python standard, odoo come ho detto e ridetto storicamente ha fatto casino ed ha impostato a FALSE anche elementi che FALSE non dovevano mai essere da qui la confusione su q-web.