2013-03-06 14 views
2

我從purchase.order.line繼承。我添加了一堆相關的字段。它們都通過order_line中的product_id與product.product中的字段相關。openerp覆蓋onchange行爲而不影響基地

我想要實現的是,當用戶選擇或更改採購訂單行表單中的產品時,應使用所選產品的值刷新/更新/填充相關字段。

我已經寫了onchange方法,但我不知道如何從繼承視圖中調用它? product_id字段已經存在於(父級)order_line視圖中,並且它已經定義了一個onchange。我如何讓系統使用我的onchange?

我不想打擾purchase.order.line中已存在的onchange_productid方法。所以無論是在我的onchange還是之後,它都應該繼續它的標準功能。

感謝

編輯:最新版本(收到錯誤時,任何相關的many2one或選擇字段中有值)。

class purchase_order_line_custom(osv.osv): 
    _name = 'purchase.order.line' 
    _inherit = 'purchase.order.line' 

    def onchange_product_id(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id, partner_id, date_order=False, fiscal_position_id=False, date_planned=False, name=False, price_unit=False, context=None): 
    values = super(purchase_order_line_custom, self).onchange_product_id(cr, uid, ids, pricelist_id, product_id, qty, uom_id, partner_id, date_order, fiscal_position_id, date_planned,name, price_unit, context=context) 
    if product_id: 
     product = self.pool.get('product.product').browse(cr, uid, product_id, context=context) 
     values['value'].update({ 
           'qualified_name':product.qualified_name, 
           'product_type' : product.product_type or None, 
           'product_subtype' : product.product_subtype, 
           'count_id':product.count_id or None 
     }) 
    return values 

_columns={ 
      'product_type': fields.related('product_id','product_type',type='selection', string='Product Type', selection=[('X','X'),('Y','Y'),('Z','Z')]), 
      'product_subtype': fields.related('product_id','product_subtype',type='char', size=64, string='Sub-Type'), 
      'qualified_name': fields.related('product_id','qualified_name',type='char', size=64, string='Qualified Name'), 
      'count_id': fields.related('product_id','count_id',type='many2one',relation='product.mycount',string='Count') 
      } 

purchase_order_line_custom() 

回答

2

您需要在此改變的onchange功能(可以使用超())的字段「PRODUCT_ID」和更新的結果。 例如

def onchange_product(self,cr,uid,ids,product_id,context=None): 
    values = super(<your_class_name>,self).onchange_product(cr, uid,ids,product_id,context=context) 
    # values will be a dictionary containing 'value' as a key. 
    # You need to add all the newly added related fields and other fields to the values['value']. 
    # if 'aaa' is the newly added field, then values['value'].update({'aaa':<value for aaa>}) 
    # then return values 
    return values 

修改你的onchange以下

def onchange_product_id(self, cr, uid, ids, pricelist_id, product_id, qty, uom_id, 
    partner_id, date_order=False, fiscal_position_id=False, date_planned=False, 
    name=False, price_unit=False, context=None): 
    values = super(purchase_order_line_custom, self).onchange_product_id(cr, uid, ids, pricelist_id, product_id, qty, uom_id, partner_id, date_order, fiscal_position_id, date_planned,name, price_unit, context=context) 
    if product_id: 
     product = self.pool.get('product.product').browse(cr, uid, product_id, context=context) 
     values['value'].update({ 
      'product_type' : product.product_type, 
      'product_subtype' : product.product_subtype, 
      'qualified_name' : product.qualified_name, 
      'count_id' : product.count_id     
     }) 
    return values 
+0

謝謝,但你能指出一個覆蓋是如何完成的。我在代碼中搜索重寫示例,但我看到的所有評論都說這個方法會覆蓋該方法等。它是否按名稱工作?如果是的話,我已經嘗試過了。 – 2013-03-06 10:13:53

+0

另請注意,在這種情況下,超類需要一系列參數,而我不需要任何參數在我的繼承onchange。所以爲了調用super,是否需要在我的onchange參數中添加所有這些參數以傳遞它們? – 2013-03-06 10:37:37

+0

@RazaAli修改我的答案。請檢查它 – OmaL 2013-03-06 10:48:24

1

首先,讓我們明白了爲什麼使用fields.related

fields.related字段指向當前記錄的另一個字段內的某些數據。

這意味着,當您選擇其他字段的值時,相關的字段將被自動填充。

實施例:

_columns = { 
     'product_id': fields.many2one('product.product', 'Product'), 
     'product_name': fields.related('product_id', 'name', type='char', string='Product Name'), 
    } 

在這個例子中product_name將被自動填充時,將選擇product_id。你不必爲此寫onchange

你可以找到很多fields.related的例子。

+0

這就是我所期望的,但是直到整個記錄被保存時纔會填充它。我在代碼中搜索了其他地方,並且出於同樣的原因使用onchange。 – 2013-03-06 10:17:04