You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:36:01