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

如何在Odoo中通过按钮实现字段的显示/隐藏切换?

Odoo表单视图按钮控制字段显隐的正确实现方法

核心思路

用Boolean字段存储显隐状态,通过视图的attrs属性绑定字段条件,关键是按钮触发字段状态切换时避免表单页面重载——这应该是你之前遇到字段重新显示问题的核心原因。

步骤实现

1. 在模型中添加Boolean控制字段

在对应模型文件中添加用于控制显隐的Boolean字段:

from odoo import models, fields

class YourModel(models.Model):
    _name = 'your.model.name'
    _description = 'Your Model'

    # 控制字段显隐的开关
    show_hidden_fields = fields.Boolean(string="显示隐藏字段", default=False)
    
    # 其他业务字段示例
    normal_field = fields.Char(string="普通字段")
    hidden_field_1 = fields.Char(string="隐藏字段1")
    hidden_field_2 = fields.Char(string="隐藏字段2")

2. 编写按钮触发的切换方法

在模型中添加按钮调用的方法,更新Boolean字段状态,同时返回不触发页面重载的客户端动作:

def toggle_fields_visibility(self):
    self.ensure_one()
    # 切换Boolean字段状态
    self.write({'show_hidden_fields': not self.show_hidden_fields})
    # 返回客户端动作,仅提示状态变化,不重载页面
    return {
        'type': 'ir.actions.client',
        'tag': 'display_notification',
        'params': {
            'message': '字段显隐状态已切换',
            'type': 'success',
            'sticky': False,
        },
    }

注:如果是Odoo 13以下版本,可改用return {'type': 'ir.actions.client', 'tag': 'reload'}触发视图局部更新,但会轻微刷新表单,优先推荐上面的通知方式。

3. 在表单视图中配置按钮和字段显隐规则

在XML视图文件中添加按钮,并给需要控制的字段/组绑定attrs条件:

<odoo>
    <record id="your_model_form_view" model="ir.ui.view">
        <field name="name">your.model.form.view</field>
        <field name="model">your.model.name</field>
        <field name="arch" type="xml">
            <form>
                <header>
                    <!-- 切换按钮,type必须为object -->
                    <button name="toggle_fields_visibility" string="切换字段显隐" type="object" class="btn-primary"/>
                </header>
                <sheet>
                    <group>
                        <field name="normal_field"/>
                    </group>
                    <!-- 用组批量控制字段显隐 -->
                    <group attrs="{'invisible': [('show_hidden_fields', '=', False)]}">
                        <field name="hidden_field_1"/>
                        <field name="hidden_field_2"/>
                    </group>
                    <!-- 单独给字段设置显隐规则 -->
                    <field name="hidden_field_3" attrs="{'invisible': [('show_hidden_fields', '=', False)]}"/>
                </sheet>
            </form>
        </field>
    </record>
</odoo>

常见问题排查

  • 确保show_hidden_fields字段已被添加到视图的可用字段中(如果视图指定了fields属性,必须包含该字段)
  • 按钮的type必须设置为object,否则无法调用模型中的方法
  • 避免在按钮方法中返回会导致页面重载的动作(如ir.actions.act_window),否则会重置表单状态
  • 如果切换后字段仍未更新,可通过调试模式确认show_hidden_fields字段值是否正确变化

内容的提问来源于stack exchange,提问作者Nhã Phạm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:01:46