Odoo多站点场景下如何避免WebEditor覆盖自定义模块视图
Odoo多站点下阻止WebEditor视图覆盖自定义继承的解决方案
问题根源:Odoo多站点场景中,使用WebEditor编辑portal_my_details页面时,系统会自动生成对应网站的专属视图(ID格式如portal_my_details[mywebsitename]),该视图与原基础视图使用相同的key,会直接覆盖原视图及基于原视图的自定义继承逻辑,导致新增的企业邮箱、电话字段失效。
以下是三种可行的解决方式:
方案1:禁止WebEditor编辑该视图(彻底阻止生成专属视图)
通过修改原视图的customize_show属性,禁用WebEditor对该视图的编辑权限,系统就不会生成网站专属视图。在自定义模块中添加以下XML代码:
<odoo> <data> <!-- 禁用portal_my_details视图的WebEditor编辑权限 --> <record id="portal.portal_my_details" model="ir.ui.view"> <field name="customize_show">False</field> </record> <!-- 原有的继承模板代码 --> <template id="portal_my_details_zsb" inherit_id="portal.portal_my_details"> <xpath expr="//form/div[hasclass('o_portal_details')]/div/div" position="inside"> <div t-attf-class="form-group #{error.get('mbr_pro_email') and 'o_has_error' or ''} col-xl-6"> <label class="col-form-label" for="mbr_pro_email">Email Pro.</label> <input type="email" name="mbr_pro_email" t-attf-class="form-control #{error.get('mbr_pro_email') and 'is-invalid' or ''}" t-att-value="mbr_pro_email or partner.mbr_pro_email"/> </div> <div t-attf-class="form-group #{error.get('mbr_pro_phone') and 'o_has_error' or ''} col-xl-6"> <label class="col-form-label" for="mbr_pro_phone">Téléphone Pro.</label> <input type="tel" name="mbr_pro_phone" t-attf-class="form-control #{error.get('mbr_pro_phone') and 'is-invalid' or ''}" t-att-value="mbr_pro_phone or partner.mbr_pro_phone"/> </div> </xpath> </template> </data> </odoo>
优点:彻底解决视图覆盖问题,无需担心后续站点编辑影响;缺点:无法通过WebEditor修改该页面的其他内容。
方案2:提高自定义继承视图的优先级
Odoo视图的优先级由sequence字段控制,数值越小优先级越高。给自定义继承视图设置更小的sequence,确保它在网站专属视图之后仍能生效:
修改原继承模板,添加sequence="1"属性:
<template id="portal_my_details_zsb" inherit_id="portal.portal_my_details" sequence="1"> <xpath expr="//form/div[hasclass('o_portal_details')]/div/div" position="inside"> <!-- 你的自定义字段代码 --> </xpath> </template>
优点:允许继续使用WebEditor编辑页面,自定义字段会保留;缺点:若WebEditor直接删除了自定义字段所在的父容器,仍会导致字段消失。
方案3:让继承视图对所有网站生效
在继承模板中添加website_id="False",使该继承视图应用于所有网站(包括自动生成的网站专属视图):
<template id="portal_my_details_zsb" inherit_id="portal.portal_my_details" website_id="False"> <xpath expr="//form/div[hasclass('o_portal_details')]/div/div" position="inside"> <!-- 你的自定义字段代码 --> </xpath> </template>
优点:无需修改原视图权限,自动适配所有站点;缺点:若网站专属视图的结构与原视图差异过大,可能导致xpath定位失效。
内容的提问来源于stack exchange,提问作者Ahrimann Steiner
相关产品推荐
相关产品推荐

