2013-07-26 2 views
5

У меня есть поле many2one как этотПоказать еще одно поле в many2one вместо имени

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

Он показывает мне все названия продуктов (имя атрибута из product_template класса) и хранит идентификатор внутри. Я хотел бы отобразить part_number продукта вместо имени и сохранить идентификатор внутри. Есть ли способ сделать это в 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 достаточно умен, что если ваша конкретная запись не имеет идентификатора продукта или продукт не имеет номера детали, он будет обрабатывать его изящно.

Если вам нужно немного сложнее, вы можете создать функциональное поле, которое показало бы, например, имя и номер детали.

+0

Спасибо Адриан, это было действительно хорошо и полезно. Однако мое намерение состоит в том, чтобы выполнить поиск части no из существующего списка продуктов (вместо имени, хотите выполнить поиск по части no). Если я укажу поле many2one, я могу ввести первые несколько букв имени, а имена продуктов, которые соответствуют, будут опущены, в моем случае мне потребуется выполнить поиск по номеру нет. Надеюсь, я ясно объяснил свою потребность. Просьба дать мне несколько предложений по ее реализации. благодаря – Vivek

0

Моя основная цель состояла в том, чтобы показать номер продукта продукта для всех продуктов и дать возможность поиска по номеру товара.

я достиг его таким образом в product.product класса (код между #Vivek и #End мои фрагменты кода)

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 

Но проблема с этой конкретной функциональности «Это глобальное изменение «везде, где вы можете перечислить продукты, дисплей будет Наименование продукта - Номер детали. Если кто-то может сделать это лучше для конкретных конкретных действий, это будет здорово.

Дальнейшие ответы приветствуются. :)

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