2016-10-17 1 views
1

私は、既存のonchangeメソッドにいくつかの機能を追加しようとしています。これはv7で宣言されており、v8を使用したいと思います。方法はstock.moveonchange_product_idです。新しいAPIを使用してv7のonchangeメソッドを上書きする方法は?

私はv7 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メソッドの定義でさらに引数を要求するエラーが表示されます。

私はまた、いくつかのパラメータとのonchangeメソッドを呼び出すことを避けるために、XMLビューでproduct_idフィールドを交換しようとしましたが、結果は同じだった:

<field name="product_id" position="replace"> 
    <field name="product_id"/> 
</field> 

方法の古いXMLコールがこれです1つ:

<field name="product_id" on_change="onchange_product_id(product_id,location_id,location_dest_id, parent.partner_id)"/> 

誰でも助けてください。私はSOに関連するいくつかの質問を見つけましたが、このケースでは何の反応も私を助けませんでした。

注:私はSuperを避け、古いonchangeメソッドのすべてのコードを新しいAPIに変換したくありません。これを管理するには、より良い方法でなければなりません。ではない?

+0

@czoelinerは正しいですが、これはほぼ同じですhttp://stackoverflow.com/questions/39366140/inherited-function-odoo-python/39368724#39368724 – danidee

+0

私はそれが重複しているとは思わないここでの焦点は新しいapiと古いapiの利用におけるonchangeメカニズムです。 – 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はそうあなたが他のすべてのパラメータが必要になりますパラメータcruididscontextをカプセル化します。たぶん、最後のパラメータでいくつかのデフォルト値が必要になるかもしれませんが、私は元の方法を知らないので、私は理解できません。

+0

ありがとう@CZoellner。このコードではエラーはありませんが、メソッド内部にv8 '@ api.onchange'デコレータの利点はありません。そのため、メソッドの最後では、 'self'_field = 'my_value''の代わりに、' result'変数の 'value'ディクショナリを自分の変更を適用するために更新する必要があります。 – forvas

+0

それは正しいです。しかし、古いonchangeメソッドは残念ながら、新しいapiと互換性がありません。 – CZoellner

+0

災害とは何か:(ご協力いただきありがとうございます。 – forvas

関連する問題