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

Odoo 16:如何通过_get_view函数按用户组和订单状态设置字段只读

解决方案

要结合用户组和订单状态设置字段的readonly属性,关键是在_get_view中获取当前订单的state值。由于_get_view是用@api.model装饰的模型方法,默认没有当前记录,需要从上下文获取活跃订单ID,再读取对应状态。

修改后的代码如下:

@api.model
def _get_view(self, view_id=None, view_type='form', **options):
    arch, view = super()._get_view(view_id, view_type, **options)
    rec_list = ['new_field1', 'new_field2', 'new_field3']
    order_state = False
    # 从上下文获取当前打开的订单ID(表单视图场景下有效)
    active_id = self.env.context.get('active_id')
    if active_id and view_type == 'form':
        # 读取订单记录的状态
        order = self.browse(active_id)
        order_state = order.state
    
    for field in arch.xpath("//field"):
        if field.get('name') in rec_list:
            # 自定义判断逻辑:管理员始终只读;非管理员仅当订单状态不是草稿时只读
            # 请根据实际业务需求调整状态条件(比如改成'purchase'已确认状态等)
            if self.env.user.has_group('base.user_admin') or (order_state and order_state != 'draft'):
                field.set('readonly', '1')
            else:
                field.set('readonly', '0')
    return arch, view

关键说明:

  • 获取订单状态:通过self.env.context.get('active_id')拿到当前表单对应的订单ID,仅在view_type='form'时处理,避免列表视图等场景的无效查询。
  • 条件组合:示例中逻辑为「管理员字段始终只读;非管理员仅当订单脱离草稿状态时字段只读」,你可以根据业务需求修改状态判断(比如order_state == 'done'等)。
  • 新建订单场景:新建订单时active_id不存在,order_state为False,此时非管理员可正常编辑字段,符合业务逻辑。

内容的提问来源于stack exchange,提问作者K.ju

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:05:11