Odoo 10:One2many树形视图中按条件修改按钮颜色
我来帮你解决Odoo 10里这个One2many树形视图按钮的问题,之前的方案无效大概率是没找对动态样式的正确姿势,我给你整理了两种可行的方案,一步步来:
解决方案:在客户表单的One2many树形视图添加条件化颜色按钮
1. 先搞定基础按钮添加
首先得把按钮加到树形视图里,因为是可编辑树形,按钮要放在<tree>标签内部。给你个完整的视图代码片段参考,你可以对应替换自己的模型和字段:
<record id="amgl.customer_form" model="ir.ui.view"> <field name="name">Customer</field> <field name="model">amgl.customer</field> <!-- 这里假设你继承的是基础客户表单,记得替换成你实际的父视图ID --> <field name="inherit_id" ref="base.view_partner_form"/> <field name="arch" type="xml"> <!-- 定位到你的One2many字段,比如order_ids --> <field name="order_ids" position="replace"> <field name="order_ids" widget="one2many_list"> <!-- 保持可编辑树形的配置 --> <tree editable="bottom"> <!-- 先保留你原来的订单字段 --> <field name="name"/> <field name="order_date"/> <!-- 这个state字段是用来判断条件的,必须要有哦 --> <field name="state"/> <!-- 重点:添加带条件颜色的按钮 --> <button name="action_process_order" type="object" string="处理订单" icon="fa-check" attrs="{'style': [('state', '=', 'draft'), 'color: green;'], ('state', '=', 'confirmed'), 'color: orange;'], ('state', '=', 'done'), 'color: gray;']}" /> </tree> </field> </field> </field> </record>
2. 动态颜色的两种实现方式
方式一:直接用attrs控制样式
上面代码里的按钮用了attrs属性,根据订单的state值动态设置颜色:
- 草稿状态(draft)→ 绿色
- 已确认状态(confirmed)→ 橙色
- 已完成状态(done)→ 灰色
如果这种方式在你的Odoo 10版本里不生效(部分旧版本对attrs的style支持有小问题),可以试试下面的方案:
方式二:计算字段+CSS类(更稳定)
这种方法兼容性更好,分两步走:
第一步:在订单模型里加个计算字段
打开你的订单模型文件(比如models/amgl_order.py),添加一个计算字段来返回对应的CSS类:
class AmglOrder(models.Model): _name = 'amgl.order' # 你的原有字段... state = fields.Selection([ ('draft', 'Draft'), ('confirmed', 'Confirmed'), ('done', 'Done') ], default='draft') # 新增计算字段,用来返回按钮的CSS类 button_css_class = fields.Char(compute='_compute_button_css_class') @api.depends('state') def _compute_button_css_class(self): for order in self: if order.state == 'draft': # Odoo自带的绿色按钮类 order.button_css_class = 'btn-success' elif order.state == 'confirmed': # Odoo自带的橙色按钮类 order.button_css_class = 'btn-warning' elif order.state == 'done': # Odoo自带的灰色按钮类 order.button_css_class = 'btn-default'
第二步:在视图里绑定这个CSS类
修改视图里的按钮部分,用Odoo的模板变量语法绑定计算字段:
<button name="action_process_order" type="object" string="处理订单" icon="fa-check" class="%(button_css_class)s" />
3. 排查之前方案无效的常见原因
如果还是不行,你可以检查这几点:
- 视图继承是否正确:确保
inherit_id指向的是正确的父视图,position定位(比如replace/inside)没写错 attrs语法是否正确:Odoo 10里attrs的style必须是列表格式,每个条件对应一个样式字符串,别写错括号- 按钮类型是否正确:如果是调用模型里的方法,
type要设为object;如果是打开动作,设为action - 权限问题:检查当前用户有没有执行按钮对应方法的权限
4. 最后别忘了测试
修改完视图和模型后,一定要升级你的模块,然后刷新页面,打开客户表单看看One2many树形里的按钮是不是正常显示,颜色有没有根据状态变化~
内容的提问来源于stack exchange,提问作者Ancient
相关产品推荐
相关产品推荐

