Odoo 8中如何先选bloc再加载对应floor(无冗余关联)
Odoo 8 实现Room表单按Bloc过滤Floor(无冗余关联)
核心思路
不需要给Room表添加冗余的Bloc关联字段,而是通过临时非存储字段+onchange动态过滤的方式实现需求:在Room表单里加一个不存库的Bloc选择框,用它来触发Floor选项的过滤逻辑,既满足先选Bloc再选对应Floor的交互,又不会产生数据库冗余。
具体实现步骤
1. 在Room模型中添加临时Bloc字段
打开Room对应的Python模型文件(如room.py),添加一个非存储的bloc_id字段:
from openerp import models, fields, api class Room(models.Model): _name = 'room' # 现有字段保持不变 name = fields.Char(string='Room Name') floor_id = fields.Many2one('floor', string='Floor') # 添加临时非存储Bloc字段 bloc_id = fields.Many2one('bloc', string='Bloc', store=False)
store=False是关键,这个字段不会被写入数据库,完全用于前端交互触发过滤。
2. 编写onchange事件实现动态过滤
在同一个Room模型中,添加onchange方法,当临时Bloc字段变化时,动态修改Floor字段的可选范围:
@api.onchange('bloc_id') def onchange_bloc_id(self): # 切换Bloc时先清空已选的Floor,避免无效值 self.floor_id = False if self.bloc_id: # 返回动态domain,只显示当前Bloc下的Floor return {'domain': {'floor_id': [('bloc_id', '=', self.bloc_id.id)]}} else: # 未选Bloc时清空Floor的可选范围 return {'domain': {'floor_id': []}}
3. 调整Room表单视图布局
打开Room的表单视图XML文件(如room_view.xml),把临时的bloc_id字段放到floor_id字段前面,确保用户先选Bloc再选Floor:
<record id="view_room_form" model="ir.ui.view"> <field name="name">room.form</field> <field name="model">room</field> <field name="arch" type="xml"> <form string="Room"> <sheet> <group> <!-- 临时Bloc选择框放前面 --> <field name="bloc_id"/> <!-- 过滤后的Floor选择框 --> <field name="floor_id"/> <!-- 其他字段保持不变 --> <field name="name"/> </group> </sheet> </form> </field> </record>
效果验证
重启Odoo服务并更新模块后,打开Room的新建表单:
- 先选择Bloc,Floor下拉框会自动加载该Bloc下的所有Floor
- 切换Bloc时,已选的Floor会被清空,同时Floor选项自动更新
- Room表的数据库结构不会新增Bloc关联字段,完全避免冗余
内容的提问来源于stack exchange,提问作者BnsHm
相关产品推荐
相关产品推荐

