2016-10-17 1 views
1

Я пытаюсь добавить некоторые функции к существующему методу обмена. Это объявлено в 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. Это должен быть лучший способ справиться с этим. Не так ли?

+0

@czoeliner прав ... но это почти дубликат http://stackoverflow.com/questions/39366140/inherited-function-odoo-python/39368724#39368724 – danidee

+0

Я не думаю, что это дубликат или почти, потому что здесь основное внимание уделяется механизму обмена в использовании нового api AND old api. – CZoellner

ответ

1

Оно должно быть:

@api.multi 
def onchange_product_id(
     self, product_id, location_id, location_dest_id, partner_id): 
    self.ensure_one() 
    result = super(StockMove, self).onchange_product_id(
     product_id, location_id, location_dest_id, partner_id) 

    # your result manipulation here 

    return result 

Декоратор multi будет инкапсулировать параметры cr, uid, ids и context так что вам потребуется все другие параметры. Возможно, вам понадобятся некоторые значения по умолчанию для последних параметров, но я не знаю оригинальный метод, поэтому я не могу сказать.

+0

спасибо @CZoellner. С этим кодом ошибок нет, но я не могу иметь преимущества v8 '@ api.onchange' decorator внутри метода. И в связи с этим, в конце метода мне придется обновить словарь 'value' в переменной' result', чтобы применить мои изменения (вместо того, чтобы делать 'self.my_field = 'my_value''). – forvas

+0

Да, это правильно. Но старые методы onchange, к сожалению, не совместимы с новым api. – CZoellner

+0

Какая катастрофа тогда :(Большое спасибо за вашу помощь. – forvas

 Смежные вопросы

  • Нет связанных вопросов^_^