2013-07-26 11 views
5

Ho un campo come questo many2onevisualizzare un altro campo in many2one invece del nome

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

Mi visualizza tutti i nomi dei prodotti (attributo name dalla classe product_template) e negozi di id all'interno. Vorrei visualizzare il numero_parte del prodotto anziché il nome e l'ID del negozio all'interno. C'è un modo per farlo in openerp7. Grazie per il tuo tempo.

risposta

-1

quando si utilizza il metodo di ricerca, si ottengono tutti i dati di informazioni del prodotto.

se si ottiene le proprietà usano:

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

Spero che si usa. saluti

5

Ci sono un paio di modi per farlo.

Il nome visualizzato per i campi relazionali è il risultato del metodo name_get. È possibile ereditare product.product e ignorare name_get ma ciò influirà sull'intero sistema, ogni volta che viene visualizzato un prodotto lo cambierà. È possibile codificare tutto ciò usando lo context ma sta iniziando a diventare disordinato.

Se si desidera solo il codice, creerei un campo correlato come questo.

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

e quindi utilizzare questo sul modulo. Il livello ORM è abbastanza intelligente che se il tuo particolare record non ha un ID prodotto o un prodotto non ha un codice articolo lo gestirà con garbo.

Se fosse necessario essere un po 'più complicato, è possibile creare un campo funzionale che mostra, ad esempio, il nome e il numero di parte.

+0

Grazie Adrian, è stato davvero buono e utile. Tuttavia, la mia intenzione è quella di cercare la parte no dall'elenco prodotti esistente (anziché il nome, si desidera cercare per parte n.). Se si specifica un campo many2one, posso digitare le prime lettere del nome e i nomi dei prodotti corrispondenti verranno eliminati, nel mio caso richiederei la ricerca per parte n. Spero di aver spiegato chiaramente il mio bisogno. Gentilmente dammi alcuni suggerimenti per implementarlo. Grazie – Vivek

0

La mia intenzione di base era di visualizzare il numero di parte del prodotto per tutti i prodotti e dare la possibilità di cercare per codice.

ho realizzato in questo modo in Prodotto.Nome classe, (codice tra #Vivek e #End sono i miei frammenti di codice)

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 

Ma il problema con questa particolare funzionalità è "E 'un cambiamento globale "Ovunque sia possibile elencare i prodotti, il display sarà Nome prodotto - Codice articolo. Se qualcuno può farlo meglio per azioni specifiche del contesto, sarà grandioso.

Altre risposte sono benvenute. :)

Problemi correlati