Passa al contenuto
Odoo Menu
  • Accedi
  • Provalo gratis
  • App
    Finanze
    • Contabilità
    • Fatturazione
    • Note spese
    • Fogli di calcolo (BI)
    • Documenti
    • Firma
    Vendite
    • CRM
    • Vendite
    • Punto vendita Negozio
    • Punto vendita Ristorante
    • Abbonamenti
    • Noleggi
    Siti web
    • Configuratore sito web
    • E-commerce
    • Blog
    • Forum
    • Live chat
    • E-learning
    Supply chain
    • Magazzino
    • Produzione
    • PLM
    • Acquisti
    • Manutenzione
    • Qualità
    Risorse umane
    • Dipendenti
    • Assunzioni
    • Ferie
    • Valutazioni
    • Referral dipendenti
    • Parco veicoli
    Marketing
    • Social marketing
    • E-mail marketing
    • SMS marketing
    • Eventi
    • Marketing automation
    • Sondaggi
    Servizi
    • Progetti
    • Fogli ore
    • Assistenza sul campo
    • Helpdesk
    • Pianificazione
    • Appuntamenti
    Produttività
    • Comunicazioni
    • Approvazioni
    • IoT
    • VoIP
    • Knowledge
    • WhatsApp
    App di terze parti Odoo Studio Piattaforma cloud Odoo
  • Settori
    Retail
    • Libreria
    • Negozio di abbigliamento
    • Negozio di arredamento
    • Alimentari
    • Ferramenta
    • Negozio di giocattoli
    Cibo e ospitalità
    • Bar e pub
    • Ristorante
    • Fast food
    • Pensione
    • Grossista di bevande
    • Hotel
    Agenzia immobiliare
    • Agenzia immobiliare
    • Studio di architettura
    • Edilizia
    • Gestione immobiliare
    • Impresa di giardinaggio
    • Associazione di proprietari immobiliari
    Consulenza
    • Società di contabilità
    • Partner Odoo
    • Agenzia di marketing
    • Studio legale
    • Selezione del personale
    • Audit e certificazione
    Produzione
    • Tessile
    • Metallo
    • Arredamenti
    • Alimentare
    • Birrificio
    • Ditta di regalistica aziendale
    Benessere e sport
    • Club sportivo
    • Negozio di ottica
    • Centro fitness
    • Centro benessere
    • Farmacia
    • Parrucchiere
    Commercio
    • Tuttofare
    • Hardware e assistenza IT
    • Ditta di installazione di pannelli solari
    • Calzolaio
    • Servizi di pulizia
    • Servizi di climatizzazione
    Altro
    • Organizzazione non profit
    • Ente per la tutela ambientale
    • Agenzia di cartellonistica pubblicitaria
    • Studio fotografico
    • Punto noleggio di biciclette
    • Rivenditore di software
    Carica tutti i settori
  • Community
    Apprendimento
    • Tutorial
    • Documentazione
    • Certificazioni 
    • Formazione
    • Blog
    • Podcast
    Potenzia la tua formazione
    • Programma educativo
    • Scale Up! Business Game
    • Visita Odoo
    Ottieni il software
    • Scarica
    • Versioni a confronto
    • Note di versione
    Collabora
    • Github
    • Forum
    • Eventi
    • Traduzioni
    • Diventa nostro partner
    • Servizi per partner
    • Registra la tua società di contabilità
    Ottieni servizi
    • Trova un partner
    • Trova un contabile
    • Incontra un esperto
    • Servizi di implementazione
    • Testimonianze dei clienti
    • Supporto
    • Aggiornamenti
    GitHub Youtube Twitter Linkedin Instagram Facebook Spotify
    +1 (650) 691-3277
    Richiedi una demo
  • Prezzi
  • Aiuto

Odoo is the world's easiest all-in-one management software.
It includes hundreds of business apps:

  • CRM
  • e-Commerce
  • Contabilità
  • Magazzino
  • PoS
  • Progetti
  • MRP
All apps
È necessario essere registrati per interagire con la community.
Tutti gli articoli Persone Badge
Etichette (Mostra tutto)
odoo accounting v14 pos v15
Sul forum
È necessario essere registrati per interagire con la community.
Tutti gli articoli Persone Badge
Etichette (Mostra tutto)
odoo accounting v14 pos v15
Sul forum
Assistenza

Display another field in many2one instead of name

Iscriviti

Ricevi una notifica quando c'è un'attività per questo post

La domanda è stata contrassegnata
many2onerelationshipsearch
3 Risposte
36762 Visualizzazioni
Avatar
vivek

Hi,

I have a many2one field like this

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

It displays me all the product names (name attribute from product_template class) and stores id inside. I would like to display the part_number of the product instead of name and store id inside. Is there a way to do this in openerp7. Thanks for your time.

7
Avatar
Abbandona
Hiral Patel (hip)

Use name_get(), It will be helpful.

Sehrish

By default, Odoo allows searching customers only by name and displays only the name in Many2One fields. This module enhances the Many2One search and display functionality by enabling users to search using multiple fields (Phone, Email, Mobile, etc.) and display multiple values directly inside the Partners Many2One selection.
https://apps.odoo.com/apps/modules/17.0/mh_partner_search_and_display_multiple_field

Avatar
mike
Risposta migliore

I too find the default name to be inappropriate for some things. Especially with products such as replacement parts for vehicles. They don't have names, just a description and a PN so I've had to change what is used for name. Anyway here is how it is done in Python.

def name_get(self, cr, uid, ids, context=None):
    if context is None:
        context = {}
    if isinstance(ids, (int, long)):
        ids = [ids]

    res = []
    for record in self.browse(cr, uid, ids, context=context):
        name = record.company
        res.append((record.id, name))

    return res

This overrides the default name_get method for the model and permits modification of the display name. In this case I am substituting the value of "company" for the actual name. Note this code works with many records or a single record to be compatible with both tree and form views. In your case you are looking at an already complicated name_get method for product.product.

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)
        if code:
            name = '[%s] %s' % (code,name)
        if 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)
        if sellers:
            for s in sellers:
                mydict = {
                          'id': product.id,
                          'name': s.product_name or product.name,
                          '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,
                      'default_code': product.default_code,
                      'variants': product.variants
                      }
            result.append(_name_get(mydict))
    return result

The good part of this is most of the work is done for you. In mydict change product.name to product.field_you_want_instead.

4
Avatar
Abbandona
Avatar
vivek
Autore Risposta migliore

Hi,

My basic intention was to display Part-Number of the product for all products and give ability to search by Part-Number.

I accomplished it this way in product.product class,(Code between #Vivek and #End are my code snippets)

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

But the problem with this particular functionality is "It's a global change" wherever you get to list the products the display will be Product Name - Part Number. If someone can do that better for context specific actions it will be great.

Thanks mike for your valuable input (It was useful and i've upvoted it)

Further answers are eagerly welcome. :)

3
Avatar
Abbandona
mike

Thank you! Good job with the name search override. Do you need to change the displayed name dynamically with various views? I guess you could try setting context values within a view and adding Python to trap for them.

Alexandre Boily

I worked around the "global change" problem by having a middleman model between the main view and the target object. I have a many2one field in a custom model that points to PO lines. I needed to show both the product name and some analytic account information in the form, so I created a new class with the name_get() override.

Avatar
Niyas Raphy (Walnut Software Solutions)
Risposta migliore

Hi,

By using name_get function or by adding rec_name for the model we can show the other fields in the drop down instead of name, which is the default option.

Odoo Name get function: https://www.youtube.com/watch?v=aT_tsfW5HaQ

Thanks

0
Avatar
Abbandona
Ti stai godendo la conversazione? Non leggere soltanto, partecipa anche tu!

Crea un account oggi per scoprire funzionalità esclusive ed entrare a far parte della nostra fantastica community!

Registrati
Post correlati Risposte Visualizzazioni Attività
how to set default value in many2one field
module many2one relationship search
Avatar
Avatar
Avatar
2
ott 24
10050
Analytic account search
many2one search
Avatar
0
mar 15
4254
Adding BOM lines: product search scope
product many2one relationship search bom
Avatar
0
ott 23
1691
many2one field search for by multiple criteria (name, phone number, etc)?
many2one search odoo
Avatar
Avatar
Avatar
2
feb 25
9426
How to open direct list view instead of select "Search More.." in Many2one field for Odoo16
many2one search V16
Avatar
Avatar
1
set 24
3197
Community
  • Tutorial
  • Documentazione
  • Forum
Open source
  • Scarica
  • Github
  • Runbot
  • Traduzioni
Servizi
  • Hosting Odoo.sh
  • Supporto
  • Aggiornamenti
  • Sviluppi personalizzati
  • Formazione
  • Trova un contabile
  • Trova un partner
  • Diventa nostro partner
Chi siamo
  • La nostra azienda
  • Branding
  • Contattaci
  • Lavora con noi
  • Eventi
  • Podcast
  • Blog
  • Clienti
  • Note legali • Privacy
  • Sicurezza
الْعَرَبيّة Català 简体中文 繁體中文 (台灣) Čeština Dansk Nederlands English Suomi Français Deutsch हिंदी Bahasa Indonesia Italiano 日本語 한국어 (KR) Lietuvių kalba Język polski Português (BR) română русский язык Slovenský jazyk slovenščina Español (América Latina) Español ภาษาไทย Türkçe українська Tiếng Việt

Odoo è un gestionale di applicazioni aziendali open source pensato per coprire tutte le esigenze della tua azienda: CRM, Vendite, E-commerce, Magazzino, Produzione, Fatturazione elettronica, Project Management e molto altro.

Il punto di forza di Odoo è quello di offrire un ecosistema unico di app facili da usare, intuitive e completamente integrate tra loro.

Website made with

Odoo Experience on YouTube

1. Use the live chat to ask your questions.
2. The operator answers within a few minutes.

Live support on Youtube
Watch now