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
相关产品推荐
相关产品推荐

