Odoo 15:如何用Python在XML中动态创建带字段的Notebook页面
解决Odoo动态创建Notebook页面并嵌套字段的问题
问题核心
你的代码里target.append()的用法完全错误——etree的append()方法只能接收单个XML元素,不能一次性传入一堆标签和参数。要构建嵌套的XML结构,必须逐层创建节点,再依次嵌套添加。
修正后的代码
@api.model def fields_view_get(self, view_id=None, view_type="form", toolbar=False, submenu=False): res = super().fields_view_get( view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu ) if view_type == "form": doc = etree.XML(res["arch"]) form_view_id = self.env['ir.model.data']._xmlid_to_res_id('texponto_product_customization.product_customization_template_view_form') if res.get('view_id') == form_view_id: target_notebook = doc.xpath("//notebook") if target_notebook: target_notebook = target_notebook[0] # 检查是否已存在目标page if not doc.xpath("//page[@name='Test']"): # 1. 创建page节点 page_elem = doc.makeelement("page", {"name": "Test", "string": "Teste"}) # 2. 创建customizable_lines_ids字段节点并添加到page field_lines = doc.makeelement("field", {"name": "customizable_lines_ids"}) page_elem.append(field_lines) # 3. 创建tree节点并添加到field tree_elem = doc.makeelement("tree", {"editable": "bottom"}) field_lines.append(tree_elem) # 4. 创建两个子field节点并添加到tree field_pos = doc.makeelement("field", {"name": "position_ids", "widget": "many2many_tags"}) tree_elem.append(field_pos) field_filter = doc.makeelement("field", {"name": "print_filter_ids", "widget": "many2many_tags"}) tree_elem.append(field_filter) # 5. 将构建好的page添加到notebook target_notebook.append(page_elem) res["arch"] = etree.tostring(doc, encoding="unicode") return res
额外注意事项
- 确保
customizable_lines_ids、position_ids、print_filter_ids这些字段在当前模型中已正确定义,且你拥有这些字段的访问权限。 - 如果需要根据many2many字段的选中值动态调整页面内容,需在
fields_view_get中加入对当前记录选中值的判断逻辑(当前代码为静态创建页面,若要关联选中值,需结合self记录的字段值处理)。 - 测试前建议清空Odoo视图缓存,避免旧视图影响效果。
内容的提问来源于stack exchange,提问作者arleite
相关产品推荐
相关产品推荐

