如何在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
相关产品推荐
相关产品推荐

