Odoo Help


This community is for beginners and experts willing to share their Odoo knowledge. It's not a forum to discuss ideas, but a knowledge base of questions and their answers.


Add a new field to sale.order.lines and display it in the form

on 7/23/15, 4:47 PM 1,512 views

I am trying to add a % field with the "sales margin" to each line in a sales order, so user can see sales margin for each item.

I already posted a similar question and I though I understood how to do it, but then I realized I didn't.

First thing I have to do is clearly to add a new field.

If I understood it right, it is needed to extend the class sales.order.line with the new field, and then define the extensions to the views.

Is 'sale_margin_percent.py' properly written?    I would like to use if possible OdooV8 new API style, which is what I started to learn.



from . import sale_margin_percent 


'name': 'Sales Margin Percent in Sales Orders',
'description': 'Provides sales margin percent information in Sales Orders, line by line',
'author': 'E.M.',
'depends': ['sale','sale_margin'],
'data': ['sale_margin_percent.xml'],


# -*- coding: utf-8 -*-
from openerp import models, fields, api
class sale_order_line(models.Model):
_inherit = "sale.order.line"

_columns = {
'x_sale_margin_percent': fields.Float('Margen de Ventas', (4, 2)),


<?xml version="1.0" encoding="utf-8"?>

<record model="ir.ui.view" id="sale_margin_percent_1">
<field name="name">sale.margin.percent.view.form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']/form//field[@name='price_unit']" position="after">
<field name="x_sale_margin_percent" groups="base.group_user"/>

<record model="ir.ui.view" id="sale_margin_percent_2">
<field name="name">sale.order.line.tree.margin.view.form</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='order_line']/tree//field[@name='price_unit']" position="after">
<field name="x_sale_margin_percent" groups="base.group_user"/>


The following error takes place while trying to install module:

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 537, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 574, in dispatch
    result = self._call_function(**self.params)
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 310, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 113, in wrapper
    return f(dbname, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 307, in checked_call
    return self.endpoint(*a, **kw)
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 803, in __call__
    return self.method(*args, **kw)
  File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 403, in response_wrap
    response = f(*args, **kw)
  File "/usr/lib/python2.7/dist-packages/openerp/addons/web/controllers/main.py", line 948, in call_button
    action = self._call_kw(model, method, args, {})
  File "/usr/lib/python2.7/dist-packages/openerp/addons/web/controllers/main.py", line 936, in _call_kw
    return getattr(request.registry.get(model), method)(request.cr, request.uid, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 241, in wrapper
    return old_api(self, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/openerp/addons/base/module/module.py", line 450, in button_immediate_install
    return self._button_immediate_function(cr, uid, ids, self.button_install, context=context)
  File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 241, in wrapper
    return old_api(self, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/openerp/addons/base/module/module.py", line 498, in _button_immediate_function
    registry = openerp.modules.registry.RegistryManager.new(cr.dbname, update_module=True)
  File "/usr/lib/python2.7/dist-packages/openerp/modules/registry.py", line 370, in new
    openerp.modules.load_modules(registry._db, force_demo, status, update_module)
  File "/usr/lib/python2.7/dist-packages/openerp/modules/loading.py", line 355, in load_modules
    loaded_modules, update_module)
  File "/usr/lib/python2.7/dist-packages/openerp/modules/loading.py", line 255, in load_marked_modules
    loaded, processed = load_module_graph(cr, graph, progressdict, report=report, skip_modules=loaded_modules, perform_checks=perform_checks)
  File "/usr/lib/python2.7/dist-packages/openerp/modules/loading.py", line 143, in load_module_graph
  File "/usr/lib/python2.7/dist-packages/openerp/modules/module.py", line 315, in load_openerp_module
    __import__('openerp.addons.' + module_name)
  File "/usr/lib/python2.7/dist-packages/openerp/modules/module.py", line 80, in load_module
    mod = imp.load_module('openerp.addons.' + module_part, f, path, descr)
  File "/usr/lib/python2.7/dist-packages/openerp/addons/custom/sale_margin_percent/__init__.py", line 1, in <module>
    from . import sale_margin_percent
  File "/usr/lib/python2.7/dist-packages/openerp/addons/custom/sale_margin_percent/sale_margin_percent.py", line 3, in <module>
    class sale_order_line(models.Model):
  File "/usr/lib/python2.7/dist-packages/openerp/models.py", line 254, in __init__
    setattr(self, name, column.to_field())
  File "/usr/lib/python2.7/dist-packages/openerp/fields.py", line 329, in __getattr__
    raise AttributeError(name)
AttributeError: to_field 
Abdul wahid
On 7/23/15, 11:18 PM

_columns = {

'x_sale_margin_percent': fields.Float('Margen de Ventas', (4, 2)),


replace it as

x_sale_margin_percent  = fields.Float('Margen de Ventas', (4, 2)),

Thanks it works, why _columns is used in some places/blogs/posts for this task?

on 7/24/15, 2:35 AM

it is the issue with new api . i had the same error 'AttributeError: to_field' that is why i answered the question.. and i am a beginner in odoo. thanks

Abdul wahid
on 7/24/15, 7:50 AM

Solanki Shamji

--Solanki Shamji--
| 5 2 6
Baroda, India
--Solanki Shamji--


Solanki Shamji
On 7/24/15, 2:28 AM


I think you should go with this document.


Your Answer

Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!

About This Community

This community is for professionals and enthusiasts of our products and services. Read Guidelines

Question tools

2 follower(s)


Asked: 7/23/15, 4:47 PM
Seen: 1512 times
Last updated: 8/27/16, 3:59 AM