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

Odoo V12控制器继承自定义问题:新增参数无法在视图显示

解决Odoo控制器继承并向视图传递自定义参数的问题

你的核心问题在于对Odoo控制器返回值的理解有误——调用super().home()得到的是HttpResponse响应对象,而非渲染视图用的values字典,所以直接给响应加字段根本传不到模板里。另外路由覆盖也要匹配原路由的所有路径,不然可能触发不了你的重写逻辑。下面是一步步的正确实现方式:

1. 正确继承控制器并注入自定义参数

重写home方法时,要先拿到父类准备好的values字典,添加自定义字段后再渲染视图,这样参数才能被模板读取到:

from odoo import http, SUPERUSER_ID
from odoo.addons.portal.controllers.portal import CustomerPortal

class websiteContact(CustomerPortal):
    # 覆盖原路由的所有路径,保证路由优先级正确
    @http.route(['/my', '/my/home'], type='http', auth="user", website=True)
    def home(self, **kw):
        # 获取父类预定义的门户布局参数
        values = super()._prepare_portal_layout_values()
        # 注入自定义字段isAdmin,这里也可以用组判断替代SUPERUSER_ID更灵活
        values['isAdmin'] = self.env.user.id == SUPERUSER_ID
        # 保留原视图渲染逻辑,传递修改后的values
        return request.render("portal.portal_my_home", values)

如果想更灵活地判断管理员,推荐用用户组来判断(覆盖更多管理员场景):

values['isAdmin'] = self.env.user.has_group('base.group_system')

2. 确认视图继承的正确性

你的视图代码本身没问题,但要确保几个关键点:

  • 模块依赖portal(在__manifest__.py的depends列表中添加'portal')
  • 模块安装后要升级,确保新的视图和控制器生效
  • 可以给输出加个容器,让效果更直观:
<template id="website_contact_template" inherit_id="portal.portal_contact">
    <xpath expr="//div[@class='o_portal_contact_details mb-5']" position="inside">
        <div class="mt-3 p-2 bg-light">
            <p>当前用户权限状态:<strong t-esc="isAdmin and '管理员' or '普通用户'"/></p>
        </div>
    </xpath>
</template>

3. 额外注意事项

  • 路由优先级:如果多个模块重写同一个路由,Odoo会按模块安装顺序加载,最后安装的模块路由会覆盖之前的,确保你的模块在portal之后安装
  • 调试技巧:可以在控制器里打印values字典,确认isAdmin字段是否被正确添加,或者在模板里用t-debug标签查看可用变量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:52:33