Либо приемлемы для большинства ситуаций, и в большинстве случаев они взаимозаменяемы, но они являются тонко разными. Конечно, большая разница состоит в том, что один из них доступен из Activity
, а другой - с View
. Между ними много совпадений, но иногда в Activity
у вас не будет доступа к View
, а иногда в View
у вас не будет доступа к Activity
.
Один из краевых случаев, с которыми я столкнулся с View.post
, я упомянул в ответ на другой вопрос SO на View.post
: View.post
работает только из другого потока когда View
прикреплен к окну. Это редко бывает проблемой, но иногда может привести к тому, что Runnable
никогда не будет выполняться, особенно если вы вызываете View.post
в методе onCreate
вашего Activity
. Альтернативой является использование Handler.post
, что Activity
и View.post
используются в любом случае.
(отредактировано для точности, добавлено «от другого нить ")
Проблема в том, что @api.onchange()
работает на уровне просмотра, например,
=> Edit a record in form view
=> You change value on a `@api.onchange()` field, `sq_cost` in this case
=> `@api.onchange` function is fired, some other field value is changed `standard_price` in this case
**But nothing is changed on the database yet, cause you are still on edit mode**
=> Changes are stored in database only if you press save button.
Но в случае импорта из CSV ничего не меняется на уровне просмотра, значения изменяются непосредственно в базе данных, поэтому ни одно из этот процесс выполняется.
Решение:
вместо использования функции onchange
на уровне просмотра, вы можете использовать compute function
в поле standard_price
с @api.depends('sq_cost')
. Это работает на уровне базы данных, поэтому значения будут рассчитываться всякий раз, когда вы импортируете значение sq_cost
. Что нужно иметь в виду:
** compute field is by default not stored, set `store=True`
** compute field is by default readonly, set `inverse='inverse_function'` to make this field editable