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

Odoo模块开发求助:同一模型创建不同字段的表单与树形视图失败

嘿,我懂你这会儿卡在哪了——在Odoo里给同一个模型搞两套不同字段的视图,光写个ir.actions.act_window肯定不行,因为Odoo会默认加载模型的默认视图。我给你捋一套靠谱的方案,一步步来:

步骤1:定义两套独立的Tree和Form视图

首先你得给new.trial模型分别做两组不同字段的Tree和Form视图,每个视图都要有独一无二的ID,这样后面才能精准绑定到动作上。

比如先写一套精简版的Tree视图:

<record id="new_trial_tree_slim" model="ir.ui.view">
    <field name="name">new.trial.tree.slim</field>
    <field name="model">new.trial</field>
    <field name="arch" type="xml">
        <tree>
            <!-- 这里放你想要展示的精简字段 -->
            <field name="trial_name"/>
            <field name="start_date"/>
            <field name="status"/>
        </tree>
    </field>
</record>

再写对应的精简版Form视图:

<record id="new_trial_form_slim" model="ir.ui.view">
    <field name="name">new.trial.form.slim</field>
    <field name="model">new.trial</field>
    <field name="arch" type="xml">
        <form>
            <sheet>
                <group>
                    <field name="trial_name"/>
                    <field name="start_date"/>
                </group>
                <group>
                    <field name="status"/>
                    <field name="responsible_user"/>
                </group>
            </sheet>
        </form>
    </field>
</record>

同理,你还要定义另一套完整字段的视图(比如默认视图),给它们单独的ID,比如new_trial_tree_default和new_trial_form_default。

步骤2:创建两个独立的动作(Act Window)

接下来要为每套视图创建对应的动作,明确告诉Odoo这个动作要加载哪组视图。参考你提供的代码片段,修改成这样:

<!-- 动作1:加载精简版视图 -->
<record id="action_trial_slim_view" model="ir.actions.act_window">
    <field name="name">Trial (Slim View)</field>
    <field name="res_model">new.trial</field>
    <field name="view_type">form</field>
    <field name="view_mode">tree,form</field>
    <!-- 核心:绑定该动作对应的视图 -->
    <field name="view_ids" eval="[(5, 0, 0), 
        (0, 0, {'view_mode': 'tree', 'view_id': ref('new_trial_tree_slim')}), 
        (0, 0, {'view_mode': 'form', 'view_id': ref('new_trial_form_slim')})]"/>
    <field name="domain">[]</field>
    <field name="context">{}</field>
</record>

<!-- 动作2:加载完整版视图 -->
<record id="action_trial_default_view" model="ir.actions.act_window">
    <field name="name">Trial (Full View)</field>
    <field name="res_model">new.trial</field>
    <field name="view_type">form</field>
    <field name="view_mode">tree,form</field>
    <field name="view_ids" eval="[(5, 0, 0), 
        (0, 0, {'view_mode': 'tree', 'view_id': ref('new_trial_tree_default')}), 
        (0, 0, {'view_mode': 'form', 'view_id': ref('new_trial_form_default')})]"/>
    <field name="domain">[]</field>
</record>

这里的view_ids参数是关键:

  • (5,0,0)表示先清空已有的视图关联
  • 然后用(0,0, {...})分别绑定Tree和Form视图,ref()里填你之前定义的视图ID
步骤3:把动作添加到菜单(可选)

如果你想让用户在菜单里直接看到这两个入口,把动作关联到菜单即可:

<menuitem name="Trial (Slim)" id="menu_trial_slim" parent="your_parent_menu_id" action="action_trial_slim_view"/>
<menuitem name="Trial (Full)" id="menu_trial_full" parent="your_parent_menu_id" action="action_trial_default_view"/>
额外技巧:同一个动作切换视图

如果你不想做两个菜单入口,想在同一个动作里切换视图,可以给视图加上context条件,比如在精简视图里添加:

<field name="context">{'use_slim_view': True}</field>

然后在动作里通过按钮或上下文传递参数,Odoo会自动匹配对应context的视图。不过这种方式需要处理视图优先级,适合更复杂的场景。

最后升级你的模块,刷新页面就能看到效果啦!

内容的提问来源于stack exchange,提问作者Kenji Reita Moe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:19:35