Odoo 16门户表单公共用户无法触发活动类型联动字段显示
Odoo v16门户公共用户RPC会话过期问题解决方案
核心问题分析
公共用户无持久化登录会话,触发字段变更时发起的RPC请求未携带有效身份凭证,导致Odoo判定会话过期,中断请求,最终无法加载对应必填字段区块。
针对性解决方案
1. RPC请求携带门户访问令牌
修改前端JS逻辑,从URL中提取门户页面的access_token并携带到RPC请求中,确保公共用户身份被正确识别:
- 获取访问令牌:
const urlParams = new URLSearchParams(window.location.search); const accessToken = urlParams.get('access_token'); - 调整RPC调用代码:
this._rpc({ model: 'activity.type', method: 'get_required_fields', args: [selectedIds], kwargs: { access_token: accessToken } }).then(result => { // 原有字段显示/设为必填的逻辑 result.required_fields.forEach(fieldId => { $(`#field-block-${fieldId}`).show().find('input,textarea,select').prop('required', true); }); }).catch(err => { console.error('字段加载失败:', err); });
2. 后端控制器适配公共用户权限
修改后端控制器方法,允许携带有效access_token的公共用户访问,跳过常规会话校验:
from odoo.http import request, Controller, route class PortalActivityController(Controller): @route('/portal/activity/get_required_fields', type='json', auth='public') def get_required_fields(self, selected_ids, access_token=None): # 校验访问令牌有效性 if access_token: # 替换为你实际使用的门户模型(如portal.xxx) portal_record = request.env['portal.mixin'].sudo().search([('access_token', '=', access_token)], limit=1) if not portal_record: return {'error': '无效的访问令牌'} # 执行原有业务逻辑 activity_types = request.env['activity.type'].sudo().browse(selected_ids) required_fields = activity_types.mapped('required_field_ids').mapped('name') return {'required_fields': required_fields}
3. 前端硬编码字段映射(无RPC方案)
若活动类型与必填字段的对应关系固定,可直接在前端定义映射,避免发起RPC请求:
// 活动类型ID -> 对应必填字段区块ID的映射 const activityFieldMap = { 1: ['field-block-1', 'field-block-2'], 2: ['field-block-3'], 3: ['field-block-4', 'field-block-5'] }; // 监听活动类型选择变更 $('.activity-type-multi').on('change', function() { const selectedIds = $(this).val().split(',').map(id => parseInt(id)); // 先隐藏所有字段区块并取消必填 $('.field-block').hide().find('input,textarea,select').prop('required', false); // 显示选中活动类型对应的字段区块并设为必填 selectedIds.forEach(typeId => { if (activityFieldMap[typeId]) { activityFieldMap[typeId].forEach(blockId => { $(`#${blockId}`).show().find('input,textarea,select').prop('required', true); }); } }); });
4. 延长公共用户会话超时时间
在Odoo系统参数中调整公共用户会话过期时长:
- 进入【设置】>【技术】>【系统参数】
- 搜索
web.session_timeout_public参数 - 将值调整为更大的数值(单位:秒),例如
3600(1小时)
验证流程
- 使用浏览器匿名模式打开门户表单页面
- 选择任意活动类型,检查对应必填字段区块是否正常显示
- 打开浏览器控制台,确认无
Session expired错误,RPC请求返回正常
内容的提问来源于stack exchange,提问作者DZEUF
相关产品推荐
相关产品推荐

