Odoo网站更新联系人详情报错:未知字段'umur,lama_kerja,grade,talent'
Odoo联系人模块新增字段更新报错排查
问题场景
在Odoo联系人模块新增umur、lama_kerja、grade、talent字段后,前端网站详情页能正常读取数据,但更新记录时提示<Unknown field 'umur,lama_kerja,grade,talent'>错误。
用户提供代码
Python字段定义
class ModificationContact(models.Model): _inherit = 'res.partner' umur = fields.Char('Umur', store=True) lama_kerja = fields.Char('Lama Kerja', store=True) grade = fields.Char('Grader', store=True) talent = fields.Char('Talent', store=True)
网站模板XML
<template id="my_custom_details" inherit_id="portal.portal_my_details" name="Update Contact Details"> <xpath expr="//div[hasclass('col-lg-12')]" position="after"> <div t-attf-class="form-group #{error.get('umur') and 'o_has_error' or ''} col-xl-6"> <label class="col-form-label" for="umur">Umur</label> <input type="text" name="umur" t-attf-class="form-control #{error.get('umur') and 'is-invalid' or ''}" t-att-value="umur or partner.umur" /> </div> <div t-attf-class="form-group #{error.get('lama_kerja') and 'o_has_error' or ''} col-xl-6"> <label class="col-form-label" for="lama_kerja">Lama Kerja</label> <input type="text" name="lama_kerja" t-attf-class="form-control #{error.get('lama_kerja') and 'is-invalid' or ''}" t-att-value="lama_kerja or partner.lama_kerja" /> </div> <div t-attf-class="form-group #{error.get('grade') and 'o_has_error' or ''} col-xl-6"> <label class="col-form-label" for="grade">Grade</label> <input type="text" name="grade" t-attf-class="form-control #{error.get('grade') and 'is-invalid' or ''}" t-att-value="grade or partner.grade" /> </div> <div t-attf-class="form-group #{error.get('talent') and 'o_has_error' or ''} col-xl-6"> <label class="col-form-label" for="talent">Talent</label> <input type="text" name="talent" t-attf-class="form-control #{error.get('talent') and 'is-invalid' or ''}" t-att-value="talent or partner.talent" /> </div> </xpath> </template>
后台表单继承XML
<data> <record id="view_inherit_modifier_contact" model="ir.ui.view"> <field name="name">view.inherit.modifier.contact</field> <field name="model">res.partner</field> <field name="inherit_id" ref="base.view_partner_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name ='category_id']" position="after"> <field name="umur" string="Umur"/> <field name="lama_kerja" string="Lama Kerja"/> <field name="grade" string="Grade"/> <field name="talent" string="Talent"/> </xpath> </field> </record> </data>
问题原因及解决方案
1. 门户控制器未处理新增字段
Odoo门户的联系人更新逻辑默认只处理系统原有字段,新增字段未被加入控制器的字段白名单,提交时会被字段校验拦截,触发未知字段错误。
解决代码:
继承门户控制器,重写相关方法添加自定义字段:
from odoo import http from odoo.http import request from odoo.addons.portal.controllers.portal import PortalAccount class CustomPortalAccount(PortalAccount): def details_form_validate(self, data): error, error_message = super().details_form_validate(data) # 可根据需求添加字段校验规则 if not data.get('umur'): error['umur'] = 'missing' error_message.append("Umur字段不能为空") return error, error_message def _prepare_portal_layout_values(self): values = super()._prepare_portal_layout_values() partner = request.env.user.partner_id values.update({ 'umur': partner.umur, 'lama_kerja': partner.lama_kerja, 'grade': partner.grade, 'talent': partner.talent, }) return values
2. 门户用户字段权限缺失
需确保门户用户组拥有自定义字段的读写权限,否则提交时会因权限不足触发字段识别错误。
解决步骤:
- 在模块
security目录的权限文件中添加字段权限配置:
<record id="res_partner_portal_access" model="ir.model.access"> <field name="name">res.partner.portal.access</field> <field name="model_id" ref="base.model_res_partner"/> <field name="group_id" ref="base.group_portal"/> <field name="perm_read" eval="True"/> <field name="perm_write" eval="True"/> <field name="perm_create" eval="False"/> <field name="perm_unlink" eval="False"/> </record>
- 后台进入【设置】-【技术】-【字段】,找到新增的4个字段,编辑并勾选
门户组的读写权限。
3. 模板字段赋值优化
模板中t-att-value的写法可简化,直接使用partner.umur更可靠,避免上下文变量冲突:
<input type="text" name="umur" t-attf-class="form-control #{error.get('umur') and 'is-invalid' or ''}" t-att-value="partner.umur" />
其余三个字段同理修改。
验证步骤
- 升级模块确保所有代码生效;
- 切换到门户用户编辑联系人详情并提交;
- 检查后台联系人记录,确认新增字段是否被正确更新。
内容的提问来源于stack exchange,提问作者Lazark Kertia
相关产品推荐
相关产品推荐

