2013-07-26 133 views
5

另一場我有一個many2one場這樣顯示在many2one而不是名稱

'product_id': fields.many2one('product.product', 'Product', required=True) 

它顯示了我裏面的所有產品名稱(從product_template類的名稱屬性)並存儲ID。我想顯示產品的part_number而不是名稱和商店ID。有沒有辦法在openerp7中做到這一點。謝謝你的時間。

回答

-1

當您使用瀏覽方法時,您將獲得產品的所有信息數據。

,如果你得到屬性使用:

<yourobject>.product_id.name 
<yourobject>.product_id.default_code 
<yourobject>.product_id.type 
<yourobject>.product_id.<your_property> 

我希望大家使用。問候

5

有幾種方法可以做到這一點。

顯示關係字段的名稱是name_get方法的結果。您可以繼承product.product並覆蓋name_get但這會影響整個系統,每次顯示產品時都會改變這一點。你可以使用context對此進行編碼,但它開始變得混亂。

如果你只是想要代碼,我會創建一個像這樣的相關領域。

'product_ref': fields.related(
     'product_id', 
     'part_number', 
     string='Product', 
     readonly=True, 
     type='char', 
     help = 'The product part number', 
     ) 

然後在您的表單上使用它。 ORM圖層非常聰明,如果您的特定記錄沒有產品ID或產品沒有產品編號,它會優雅地處理它。

如果您需要一點技巧,您可以創建一個功能字段,例如顯示名稱和部件號。

+0

謝謝阿德里安,這真的很好,很有用。但是我的意圖是從現有產品列表中搜索零件號(而不是名稱,想要按零件號搜索)。如果我指定一個many2one字段,我可以輸入名稱的前幾個字母,並且匹配的產品名稱將被刪除,在我的情況下,我需要通過零件號搜索。希望我已經清楚地解釋了我的需求。請給我一些實施該建議的建議。謝謝 – Vivek

0

我的基本意圖是顯示所有產品的部件號,並提供按部件號搜索的功能。

我做到了這樣的product.product類(#Vivek和#結束之間的代碼是我的代碼段)

def name_get(self, cr, user, ids, context=None): 
    if context is None: 
     context = {} 
    if isinstance(ids, (int, long)): 
     ids = [ids] 
    if not len(ids): 
     return [] 
    def _name_get(d): 
     name = d.get('name','') 
     code = d.get('default_code',False) 
     # Vivek 
     part_number = d.get('part_number',False) 
     if part_number: 
      name = '%s-%s' % (name,part_number) 
     #End 
     elif code: 
      name = '[%s] %s' % (code,name) 
     elif d.get('variants'): 
      name = name + ' - %s' % (d['variants'],) 
     return (d['id'], name) 

    partner_id = context.get('partner_id', False) 

    result = [] 
    for product in self.browse(cr, user, ids, context=context): 
     sellers = filter(lambda x: x.name.id == partner_id, product.seller_ids) 
     # Vivek 
     prd_temp = self.pool.get('product.template').browse(cr, user, product.id, context=context) 
     # End 
     if sellers: 
      for s in sellers: 
       mydict = { 
          'id': product.id, 
          'name': s.product_name or product.name, 
          #vivek 
          'part_number': prd_temp.part_number, 
          #End 
          'default_code': s.product_code or product.default_code, 
          'variants': product.variants 
          } 
       result.append(_name_get(mydict)) 
     else: 
      mydict = { 
         'id': product.id, 
         'name': product.name, 
         #vivek 
         'part_number': prd_temp.part_number, 
         #End 
         'default_code': product.default_code, 
         'variants': product.variants 
         } 
      result.append(_name_get(mydict)) 
    return result 

def name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=100): 
    if not args: 
     args = [] 
    if name: 
     ids = self.search(cr, user, [('default_code','=',name)]+ args, limit=limit, context=context) 
     if not ids: 
      ids = self.search(cr, user, [('ean13','=',name)]+ args, limit=limit, context=context) 
     if not ids: 
      # Do not merge the 2 next lines into one single search, SQL search performance would be abysmal 
      # on a database with thousands of matching products, due to the huge merge+unique needed for the 
      # OR operator (and given the fact that the 'name' lookup results come from the ir.translation table 
      # Performing a quick memory merge of ids in Python will give much better performance 
      ids = set() 
      ids.update(self.search(cr, user, args + [('default_code',operator,name)], limit=limit, context=context)) 
      if not limit or len(ids) < limit: 
       # we may underrun the limit because of dupes in the results, that's fine 
       ids.update(self.search(cr, user, args + [('name',operator,name)], limit=(limit and (limit-len(ids)) or False) , context=context)) 
       # vivek 
       # Purpose : To filter the product by using part_number 
       ids.update(self.search(cr, user, args + [('part_number',operator,name)], limit=(limit and (limit-len(ids)) or False) , context=context)) 
       #End 
      ids = list(ids) 
     if not ids: 
      ptrn = re.compile('(\[(.*?)\])') 
      res = ptrn.search(name) 
      if res: 
       ids = self.search(cr, user, [('default_code','=', res.group(2))] + args, limit=limit, context=context) 
    else: 
     ids = self.search(cr, user, args, limit=limit, context=context) 
    result = self.name_get(cr, user, ids, context=context) 
    return result 

但與此特定功能的問題是,「這是一個全球性的變化「無論您在哪裏列出產品,顯示屏都會是產品名稱 - 部件號。如果某人能夠更好地進行情境特定操作,那將會很棒。

熱烈歡迎更多的答案。 :)

相關問題