2013-07-26 7 views
5

Ich habe ein many2one Feld wie dieseAnzeige ein weiteres Feld in many2one statt Namen

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

Es zeigt mir alle Produktnamen (Name Attribut aus product_template Klasse) und speichert innerhalb ID. Ich möchte die part_number des Produktes anstatt des Namens und der Speicher-ID innerhalb anzeigen. Gibt es eine Möglichkeit, dies in openerp7 zu tun? Vielen Dank für Ihre Zeit.

Antwort

-1

Wenn Sie die Browse-Methode verwenden, erhalten Sie alle Informationsdaten des Produkts.

wenn Sie Eigenschaften erhalten verwenden:

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

Ich hoffe, dass Sie verwenden. Grüße

5

Es gibt ein paar Möglichkeiten, dies zu tun. Der Name, der für relationale Felder angezeigt wird, ist das Ergebnis der Methode name_get. Sie können product.product erben und name_get außer Kraft setzen, aber das wird das gesamte System beeinflussen, jedes Mal, wenn ein Produkt angezeigt wird, wird es dies ändern. Sie könnten das mit der context umgehen, aber es wird langsam unordentlich.

Wenn Sie nur den Code möchten, würde ich ein ähnliches Feld wie dieses erstellen.

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

und dann dieses auf Ihrem Formular verwenden. Die ORM-Ebene ist schlau genug, dass, wenn Ihr bestimmter Datensatz keine Produkt-ID hat oder ein Produkt keine Teilenummer hat, wird es elegant damit umgehen.

Wenn Sie etwas kniffliger sein müssten, könnten Sie ein Funktionsfeld erstellen, das zum Beispiel den Namen und die Teilenummer enthält.

+0

Danke Adrian, Es war wirklich gut und nützlich. Ich habe jedoch die Absicht, die Teilenummer aus der vorhandenen Produktliste zu suchen (statt nach Namen, nach Teilenummern suchen). Wenn ich ein many2one-Feld spezifiziere, kann ich die ersten paar Buchstaben des Namens eingeben und die Produktnamen, die übereinstimmen, werden fallengelassen, in meinem Fall würde ich nach Teilenummern suchen müssen. Hoffe, ich habe meine Bedürfnisse klar erklärt. Bitte geben Sie mir einige Vorschläge, dies umzusetzen. Vielen Dank – Vivek

0

Meine grundlegende Absicht war es, die Teilenummer des Produkts für alle Produkte anzuzeigen und die Möglichkeit zu geben, nach Part-Number zu suchen.

ich es auf diese Weise in Produkt.Produkt Klasse erreicht, (-Code zwischen #Vivek und #End meinen Code-Schnipsel sind)

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 

Aber das Problem mit dieser besonderen Funktionalität ist: „Es ist eine globale Änderung "wo immer Sie die Produkte auflisten, wird die Anzeige Produktname - Teilenummer. Wenn jemand das besser für kontextspezifische Aktionen tun kann, wird es großartig.

Weitere Antworten sind sehr willkommen. :)

Verwandte Themen