如何在 Odoo 12 中为表单字段创建动态标签?

How to create a dynamic label for a form field in Odoo 12?

我有一个表单视图。我向其中添加了字段 main_field,但我想根据名为 conditional_field 的其他字段的值动态更改其标签。这是我的主要尝试:

<group>
    <group name="xxx">
        <field name="conditional_field" invisible="1"/>
        <label for="main_field" string="AAA" attrs="{'invisible': [('conditional_field', '!=', 'A')]}"/>
        <label for="main_field" string="BBB" attrs="{'invisible': [('conditional_field', '!=', 'B')]}"/>
        <div>
            <field name="main_field" class="oe_inline"/>
        </div>
    </group>
</group>

这个解决方案的问题是标签总是在那里,只是看不见,但实际上它们正在占用 space。

如果BBB被隐藏,main_field出现在标签AAA下,因为BBB 不可见,但出现在 AAA 的右侧。 如果AAA被隐藏,main_field出现在标签BBB下,而BBB在右边,因为左边是看不见的AAA发生的,所以看起来更丑

问题是 Odoo 将 display: none; 设置为标签,但保留了它们所在单元格的样式,因此我的方法无法正常工作。

有什么想法吗?我试图避免为每个标签创建辅助字段,因为我必须用很多标签来做这件事,那会很乱。谢谢!

经过多次尝试,我找到了解决办法。它并不完美,由于单元格分隔符:边框消失了,所以我不得不用 CSS 复制它,而且它没有原来的高。不过看起来也不是很差,对我的情况来说已经足够了。

<group>
    <group name="xxx">
        <field name="conditional_field" invisible="1"/>
            <div class="o_form_label" style="border-right:0.8px solid #ddd; width:101%;">
                <label for="main_field" string="AAA" attrs="{'invisible': [('conditional_field', '!=', 'A')]}" style="font-weight:bold;"/>
                <label for="main_field" string="BBB" attrs="{'invisible': [('conditional_field', '!=', 'B')]}" style="font-weight:bold;"/>
            </div>
            <field name="main_field" nolabel="1" style="padding-left:8px;"/>
        </field>
    </group>
</group>

显然,CSS 样式会根据您将标签放置在表单的哪个部分而改变。例如,如果您想在发票、订单等的经典总计部分执行此操作,这将是代码:

<group class="oe_subtotal_footer oe_right">
    <field name="conditional_field" invisible="1"/>
    <div class="oe_right">
        <label for="main_field" string="AAA" attrs="{'invisible': [('conditional_field', '!=', 'A')]}" style="font-weight:bold; margin:0;"/>
        <label for="main_field" string="BBB" attrs="{'invisible': [('conditional_field', '!=', 'B')]}" style="font-weight:bold; margin:0;"/>
    </div>
    <field name="main_field" nolabel="1"/>
</group>

无论如何,如果有人找到更好的解决方案,我会更改接受的答案并提供给他们。