Я пытаюсь добавить некоторые функции к существующему методу обмена. Это объявлено в v7, и я хочу использовать v8. Метод onchange_product_id
модели stock.move
.Как перезаписать метод v7 onchange с помощью нового API?
Таким образом, я объявил свой метод v8 onchange (с тем же именем метода v7, который я хочу переписать). Я также повторно объявил поврежденное поле, product_id
, потому что если нет, мой метод onchange не вызывается (в переопределении я установил только имя коммодели, так как ожидается, что остальные атрибуты будут получены из первоначальной декларации).
Это мой код:
product_id = fields.Many2one(
comodel_name='product.product',
)
@api.v8
@api.onchange('product_id')
def onchange_product_id(self):
_logger.info('*' * 80)
self.ensure_one()
result = super(StockMove, self).onchange_product_id(
self.product_id, self.location_id, self.location_dest_id,
self.picking_id.partner_id)
return result
Теперь проблема: я не вижу даже журнальное сообщение, потому что я получаю эту ошибку:
TypeError: 'NoneType' object is not callable
Если я изменить декоратор @api .v8 и я пишу @ api.v7 вместо этого, я получаю ошибку, запрашивая больше аргументов в определении метода onchange.
Я также попытался заменить product_id
поле в представлении XML, чтобы избежать вызова OnChange метод с несколькими параметрами, но результат был тот же:
<field name="product_id" position="replace">
<field name="product_id"/>
</field>
старый XML вызов метода заключается в следующем один:
<field name="product_id" on_change="onchange_product_id(product_id,location_id,location_dest_id, parent.partner_id)"/>
Может ли кто-нибудь помочь мне, пожалуйста? Я нашел несколько вопросов, связанных с этим в SO, но никакой ответ не помог мне в этом деле.
Примечание: Я не хочу избегать Super
и перевести весь код старого метода обмена на новый API. Это должен быть лучший способ справиться с этим. Не так ли?
@czoeliner прав ... но это почти дубликат http://stackoverflow.com/questions/39366140/inherited-function-odoo-python/39368724#39368724 – danidee
Я не думаю, что это дубликат или почти, потому что здесь основное внимание уделяется механизму обмена в использовании нового api AND old api. – CZoellner