Saturday, 20 September 2014

Odoo/OpenERP : _rec_name and name_get()

_rec_name = ‘name’ (by default) 

where ‘name’ is field of the model. If ‘name’ field is not there then you have to assign any other filed name to this ‘_rec_name’ variable from columns.

Note : If ‘name’ field is there in your columns then there is no need to specify '_rec_name'.

Let’s try to dig more using an example.


Case I:


If you are having hr.employee module with name field and you are using it as reference in other module, say hr.employee.detail to provide other employee details then you will use it as:

'employee_id' : fields.many2one('hr.employee', 'Employee')

and it will show you the employee name in selection list.

But, In a company, more than one employee can share the same name. So name field can’t be used to differentiate them from each other. But, employee code will be unique for each employee. In such cases, we will take a column field like ‘emp_code’ and will assign it to ‘_rec_name’

_rec_name = ‘emp_code’

So that it can show employee code in dropdown instead of employee name.

Note : In both above cases 'id' will only be store in database. If will affect only the display part.


Case II: 


In same above example if your manager asks you to show combination of both i.e Employee Name, Employee Code what you will do?

In this case we will override name_get() method in hr.employee module

def name_get(self, cr, uid, ids, context={}):
         
        if not len(ids):
            return []

        res=[]

        for emp in self.browse(cr, uid, ids,context=context):
   res.append((emp.id, emp.name + ', ' + emp.emp_code))    

        return res

and it will display combination of both in drop-down.


Thanks!!!!!!!!!! Enjoy Programming :)


7 comments:

  1. Hi overridden the name_get() method and i am showing the combination of emp name and code in the many2one dropdown. now the thing is i want to search the emp with emp code . If i try to search with emp name all names are listing but if i try to search with emp code it is showing create button to create the record. Please give me the solution for this.

    Thanks in advance.

    ReplyDelete
    Replies
    1. For searching, we created a stored computed field called 'display_name'. Then set it as the 'rec_name'.
      Benefit of searching both name and code at once.

      Delete
  2. I think you have to set just

    _rec_name = ‘emp_code’

    as well.

    ReplyDelete
  3. Hi,
    do you have any idea how to solve this?
    http://stackoverflow.com/questions/31038103/odoo-8-howto-add-product-template-attribute-to-product-product-name-get
    It's a similar occasion...

    ReplyDelete
  4. somewhat same problem as thomas, not able to search (all hierarchy are listed)
    def name_get(self, cr, uid, ids, context=None):
    if not ids:
    return []

    self._rec_name = 'hierarchy'

    res = []
    obj = self.pool.get('soldier2ndlife.product.categories')
    ids = obj.search(cr, uid, [('hierarchy', '!=', '')], context=context)

    for r in self.read(cr, uid, ids, ['id', 'hierarchy'], context):
    res.append((r['id'], r['hierarchy'])) # append the tuple in the list res

    return res

    ReplyDelete
  5. Hi Friends,
    I have another doubt here.I want to know the way to find which field is applied in _rec_name in the particular model.

    I have taken that model id from ir.model table and also I could find all the fields list created in that model through ir.model.fields table.But I could not find which field is used in _rec_name?

    Could you please help me?

    ReplyDelete

Thanks for your valuable comments.

Odoo 10: Close wizard and open standard form

Hi, Today we are going to learn how to open standard form after saving data in wizard. Let's say I have created an wizard to fill bas...