如何在Odoo表单视图设置所有字段为只读?含Odoo v10 Python实现问询
在Odoo v10中设置表单视图所有字段为只读的方法
针对你的需求,我整理了两种可行方案,分别适配静态固定配置和动态条件控制的场景:
方案一:通过XML视图直接配置(静态方式)
如果只是想固定让某个表单视图的所有字段处于只读状态,直接修改视图XML是最省心的方式:
方法1:批量修改所有字段
可以用xpath匹配视图里的所有<field>节点,统一给它们加上只读属性:
<record id="your_model_custom_form_view" model="ir.ui.view"> <field name="name">your.model.custom.form.view</field> <field name="model">your.model</field> <field name="inherit_id" ref="your_module.your_model_base_form_view"/> <field name="arch" type="xml"> <!-- 匹配所有field节点,设置readonly属性 --> <xpath expr="//field" position="attributes"> <attribute name="readonly">True</attribute> </xpath> </field> </record>
这种继承原视图的方式,不用逐个修改字段,一次性就能批量生效。
方法2:设置整个表单只读
如果你的表单完全不需要任何编辑操作,还可以直接给<form>标签设置只读属性,这样整个表单的所有字段会自动变为只读:
<record id="your_model_custom_form_view" model="ir.ui.view"> <field name="name">your.model.custom.form.view</field> <field name="model">your.model</field> <field name="inherit_id" ref="your_module.your_model_base_form_view"/> <field name="arch" type="xml"> <xpath expr="//form" position="attributes"> <attribute name="readonly">1</attribute> </xpath> </field> </record>
方案二:通过Python代码动态修改(动态方式)
如果需要根据业务条件(比如用户权限、记录状态)动态切换只读状态,或者想用Python代码批量修改视图字段属性,可以重写模型的fields_view_get方法:
from lxml import etree from odoo import models, api class YourModel(models.Model): _inherit = 'your.model' @api.model def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): res = super(YourModel, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu) if view_type == 'form': # 解析视图的XML结构 doc = etree.XML(res['arch']) # 遍历所有field节点,设置只读属性 for field in doc.xpath('//field'): field.set('readonly', 'True') # 更新视图架构并返回 res['arch'] = etree.tostring(doc, encoding='unicode') return res
如果要添加条件判断(比如仅对特定用户组生效),可以在设置属性前加入逻辑,示例:
# 仅当当前用户属于系统管理员组时,设置所有字段只读 if self.env.user.has_group('base.group_system'): field.set('readonly', 'True')
注意事项
- 使用视图继承时,要确保
inherit_id指向正确的原视图ID; - 动态修改视图时,记得判断
view_type == 'form',避免影响tree等其他类型视图; - Odoo v10中,
readonly属性的值可以用"True"、"1",XML里推荐用字符串形式。
内容的提问来源于stack exchange,提问作者Younis Mahsud
相关产品推荐
相关产品推荐

