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

