在Odoo开发中,ref是一个非常重要的函数,用于在XML文件中引用其他数据的ID,帮助我们快速定位和调用系统中已经存在的记录。
在Odoo开发中,ref是一个非常重要的函数,用于在XML文件中引用其他数据的ID,帮助我们快速定位和调用系统中已经存在的记录。ref的全称是reference,可以通过该函数引用特定的视图、字段、模型等元素,从而在模块开发中实现跨文件、跨模块的引用。下面我会详细解释ref的作用,并提供丰富的示例,帮助你更好地理解和掌握它。
1. 基本语法
ref的基本语法是<field name="field_name" ref="module_name.xml_id"/>,其中:
field_name:字段的名称,用于指定需要引用的位置。module_name.xml_id:模块名和XML ID的组合。module_name是所引用对象的所属模块,xml_id是该对象的XML ID。
2. ref的基本用法示例
示例1:引用视图
在Odoo中可以使用ref引用一个视图。假设我们需要在自定义模块中使用purchase模块中的某个视图:
<field name="view_id" ref="purchase.purchase_order_tree"/>
这里,purchase是模块名称,purchase_order_tree是该模块中视图的XML ID。这段代码用于引用purchase模块中的采购订单树状视图。
示例2:引用菜单项
当我们需要引用另一个模块的菜单项时,可以使用ref。假设我们需要引用account模块中的会计菜单:
<field name="menu_id" ref="account.menu_finance_accounting"/>
在这里,account.menu_finance_accounting代表account模块中的会计菜单项。
示例3:引用操作(action)
有时我们需要引用另一个模块中的操作(action),例如在自定义模块中引用hr模块中的雇员表单视图操作:
<field name="action" ref="hr.open_view_employee_form"/>
这段代码表示引用hr模块中的雇员表单视图操作。
3. 常见用法场景
场景1:设置默认视图
在Odoo中创建一个新菜单项,并让它打开一个特定视图。我们可以使用ref来设置默认视图。例如:
<record id="menu_my_custom_view" model="ir.ui.menu"> <field name="name">我的自定义视图</field> <field name="parent_id" ref="base.menu_custom"/> <field name="action" ref="my_module.action_my_custom_view"/> </record>
这里,我们创建了一个新的菜单项menu_my_custom_view,并使用ref引用一个自定义的操作action_my_custom_view。这将打开指定的视图。
场景2:引用安全组
在Odoo的权限控制中,可以通过ref为不同的操作分配用户权限。例如:
<record id="model_my_model_rule" model="ir.rule"> <field name="name">访问我的模型</field> <field name="model_id" ref="model_my_model"/> <field name="groups" eval="[(4, ref('my_module.group_my_custom_group'))]"/> </record>
这里通过ref引用了一个安全组group_my_custom_group,该安全组允许特定用户访问模型my_model。
场景3:引用字段
如果需要在代码中引用某个字段,可以使用ref。假设我们需要引用res.partner模型中的customer字段:
<field name="field_name" ref="base.field_res_partner__customer"/>
这会引用base模块中res.partner模型的customer字段。这种引用方式通常用于字段的继承或扩展。
场景4:引用数据记录
我们还可以使用ref引用特定数据记录。例如,在为某个产品设置默认分类时,可以使用ref引用分类ID:
<field name="categ_id" ref="product.product_category_all"/>
这里引用了product模块中的一个产品分类product_category_all。
4. ref的高级用法
高级示例1:动态视图引用
有时,我们需要根据某些条件动态引用不同的视图。可以通过ref结合if条件实现。
<field name="view_ids" eval="[(0, 0, {'view_mode': 'tree', 'view_id': ref('module.view_tree')}), (0, 0, {'view_mode': 'form', 'view_id': ref('module.view_form')})]"/>
这段代码会在视图模式为树和表单时,动态引用不同的视图ID。
高级示例2:设置继承视图的父视图
在Odoo中创建继承视图时,需要指定父视图。可以使用ref来引用父视图。例如:
<record id="inherit_purchase_order_form" model="ir.ui.view"> <field name="name">purchase.order.form.inherit</field> <field name="model">purchase.order</field> <field name="inherit_id" ref="purchase.purchase_order_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='partner_id']" position="after"> <field name="custom_field"/> </xpath> </field> </record>
这里inherit_id使用ref引用了purchase模块中的purchase_order_form表单视图,并在partner_id字段后添加了custom_field字段。
高级示例3:动态设置默认值
在创建记录时,可以通过ref为字段设置默认值。例如,在创建采购订单时,可以通过ref为供应商字段设置默认供应商:
<record id="purchase_order_default" model="purchase.order"> <field name="partner_id" ref="base.res_partner_1"/> </record>
这里引用了base模块中的供应商res_partner_1,作为采购订单的默认供应商。
5. 注意事项
ref只能引用已经定义的XML ID,因此引用的ID必须在被引用之前存在。- 如果跨模块引用,确保模块依赖关系已正确定义,否则会导致引用失败。
- 使用
ref时,注意ID的拼写准确,因为错误的ID会导致系统错误。
总结
ref是Odoo开发中不可或缺的一个工具,它能帮助我们在不同的模块和文件中引用已有的记录、视图、字段等。无论是简单的视图引用,还是高级的权限控制和继承配置,ref都可以使我们的开发过程更加便捷、高效。

浙公网安备 33010602011771号