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

Odoo按字段值与用户组条件控制按钮可见性实现方法

Odoo 按采购类型+用户组控制审批按钮可见性方案

实现逻辑说明

Odoo原生按钮的groups属性只能做粗粒度的组权限控制,无法同时叠加字段值判断,因此需要通过计算字段控制前端可见性+后端逻辑兜底校验的方式实现需求。


具体操作步骤

1. 模型层新增可见性计算字段

在对应Python模型中新增布尔型计算字段,统一判断按钮显示的两个必要条件:

  • 单据purchase_type字段值为import
  • 当前登录用户属于ts_addons_tbk.group_tbk_director或ts_addons_tbk.group_tbk_exim组

示例代码(替换模型名为你实际使用的业务模型即可):

from odoo import models, fields, api, _
from odoo.exceptions import UserError

class YourPurchaseModel(models.Model):
    _inherit = 'your.purchase.model'  # 替换为实际模型名,如purchase.order

    # 原有字段保留
    purchase_type = fields.Selection([
        ('import', 'Import'),
        ('local', 'Local'),
    ], string='Purchase Type')

    # 新增按钮可见性控制字段
    approve_btn_visible = fields.Boolean(
        compute='_compute_approve_btn_visible',
        store=False
    )

    @api.depends('purchase_type')
    def _compute_approve_btn_visible(self):
        for rec in self:
            # 判断用户是否在允许的组内
            is_allowed_user = self.env.user.has_group('ts_addons_tbk.group_tbk_director') \
                              or self.env.user.has_group('ts_addons_tbk.group_tbk_exim')
            # 两个条件同时满足才可见
            rec.approve_btn_visible = rec.purchase_type == 'import' and is_allowed_user

2. 修改表单视图按钮定义

移除按钮原有groups属性(避免manager组无限制看到按钮),新增invisible属性绑定计算字段,保留原有states状态限制:

<button 
    name="action_approve" 
    string="Approve" 
    type="object" 
    states="confirm"
    invisible="not approve_btn_visible"
/>

3. 新增后端权限兜底校验

前端隐藏仅为界面展示控制,必须在按钮对应的后端方法中增加权限校验,防止用户通过RPC接口越权调用:

def action_approve(self):
    for rec in self:
        is_allowed_user = self.env.user.has_group('ts_addons_tbk.group_tbk_director') \
                          or self.env.user.has_group('ts_addons_tbk.group_tbk_exim')
        if rec.purchase_type == 'import' and not is_allowed_user:
            raise UserError(_('您无权审批进口类型采购单据'))
    # 原有审批逻辑保留
    return super().action_approve()

注意事项

  • 禁止直接在按钮invisible属性中写用户组判断逻辑,Odoo视图域表达式不支持直接解析当前用户的组关联关系,通过计算字段实现兼容性、可维护性最高
  • 原按钮上的groups属性必须删除,否则配置的group_tbk_manager组用户会无视采购类型限制看到按钮
  • 不要省略后端校验步骤,所有前端可见性控制都可以被技术手段绕过,后端校验是权限安全的唯一可靠兜底

内容的提问来源于stack exchange,提问作者Nur Faiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:36:24