When to use eval in XML fields?

Alejandro Santana

Hi. I wonder when to use within a XML field definition:

  • eval="..."
  • eval="ref('...')"
  • ref="..."

I ask because I have seen different options to semingly the same cases.

For example, for boolean fields, I find:

  • <field name="dayofweek">1</field>
  • <field name="priority" eval="1"/>

For refs, I find:

  • <field name="calendar_id" ref="timesheet_group1"/>
  • <field name="parent_id" eval="ref('mt_task_new')"/>
1 Answer
Best Answer

Odoo document link for eval and ref attribute are:-

eval attribute

The eval attribute evaluate its content as if it was Python code. This allows you to define values that are not strings.

Normally, content inside <field> tags are always evaluated as strings.

Example 1:

<field name="value">2.3</field>

This will evaluate to the string '2.3' and not the float 2.3

Example 2:

<field name="value">False</field>

This will evaluate to the string 'False' and not the boolean False

If you want to evaluate the value to a float, a boolean or another type, except string, you need to use the eval attribute:

<field name="value" eval="2.3" /> <field name="value" eval="False" />

ref attribute

The ref attribute allows to fill relations between the records :

<field name="company_id" ref="main_company"/>

The``company_id`` field is a many-to-one relation from the user object to the company object, and main_company is the id of to associate.


In xml using eval and ref  attribute to assign the value for field and create new master record:-

Example:- addons/product/product_view.xml

     <record id="product_uom_categ_vol" model="product.uom.categ">
            <field name="name">Volume</field>

        <record id="product_uom_gal" model="product.uom">
            <field name="name">gal(s)</field>
            <field name="category_id" ref="product_uom_categ_vol"/>
            <field name="factor_inv" eval="3.78541"/>

            <field name="uom_type">bigger</field>


Alejandro Santana

Thanks. I see. But then, this case: is redundant. You do not need "eval" if you are already using "ref", isn't it?


yes either use eval or ref. using ref assign xml record ID value and using eval assign normal value

I did note that in some cases eval="ref(...)" gives no error, but using ref="" does.

It might be that ref called from eval is no mandatory to exist.