如何在 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>
无论如何,如果有人找到更好的解决方案,我会更改接受的答案并提供给他们。
我有一个表单视图。我向其中添加了字段 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>
无论如何,如果有人找到更好的解决方案,我会更改接受的答案并提供给他们。