ir.actions.act_window导致标签无法点击的Odoo技术求助
嘿,作为刚接触Odoo和Python的新手,遇到这种关联视图的问题真的太常见了!我来帮你一步步拆解这个“能看到患者专属日历但没法打开详情”的问题,咱们从最可能的原因开始排查:
这是最容易出问题的地方——你的按钮跳转动作可能没正确配置视图类型,或者过滤逻辑影响了详情打开。
首先看你按钮的XML定义,是不是像下面这样传递了上下文,并且关联了正确的动作:
<button name="%(patient.action_patient_calendar)d" string="Show Calendar" type="action" context="{'search_default_patient_id': active_id}"/>
然后对应的动作(ir.actions.act_window)一定要包含form视图模式,不然点击日历事件时没有可跳转的详情页:
<record id="action_patient_calendar" model="ir.actions.act_window"> <field name="name">Patient Calendar</field> <field name="res_model">calendar.event</field> <!-- 这里必须写calendar,form,只写calendar的话只能看日历视图,没法打开详情 --> <field name="view_mode">calendar,form</field> <!-- 用domain过滤当前患者的日历事件,和上下文二选一就行 --> <field name="domain">[('patient_id', '=', active_id)]</field> </record>
重点:view_mode里如果没有form,就算你点烂日历事件也不会弹出详情页!
你得确保calendar.event模型里真的有和你的患者模型关联的字段,不然过滤出来的日历其实是“假关联”,点击时会因为找不到关联关系报错。
在你的patient模块的models文件里,应该继承calendar.event并添加关联字段:
from odoo import models, fields class CalendarEvent(models.Model): _inherit = 'calendar.event' # 这里的patient要对应你自定义的患者模型的技术名称 patient_id = fields.Many2one('patient', string="Patient")
如果没加这个字段,那你的过滤逻辑根本不生效,甚至可能导致视图加载异常,自然打不开详情。
新手很容易忽略权限——你的患者模块权限组有没有给calendar.event的读写权限?
打开你模块下的security/ir.model.access.csv,确认有类似这样的配置:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_calendar_event_patient_user,calendar.event.patient.user,model_calendar_event,patient.group_patient_user,1,1,1,0
如果没有这个权限项,就算你能看到日历事件,点击时也会因为权限不足无法打开详情页(可能没反应,或者后台报错)。
如果前面三步都没问题,那可能是日历视图的前端配置有问题。比如你自定义了日历视图,覆盖了默认的calendar.event的form视图,导致加载失败。
可以先切换到列表视图(如果你的动作里加了tree模式),看看能不能打开详情:
- 如果列表视图能打开详情,那就是日历视图的配置问题,检查你自定义的calendar视图XML有没有正确继承默认视图,有没有写错字段。
- 如果列表也打不开,那大概率是模型关联或者权限的问题,回到前面再仔细检查。
慢慢来,新手遇到这种问题很正常,按这个顺序排查基本能解决!
内容的提问来源于stack exchange,提问作者Gun

