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

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小时)

验证流程

  1. 使用浏览器匿名模式打开门户表单页面
  2. 选择任意活动类型,检查对应必填字段区块是否正常显示
  3. 打开浏览器控制台,确认无Session expired错误,RPC请求返回正常

内容的提问来源于stack exchange,提问作者DZEUF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:49:59