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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 09:50:27