我需要隐藏或显示按钮,具体取决于Char字段中是否包含特定字符串。似乎'喜欢'运营商将是完美的。在我的xml中,我有:
<record model="ir.ui.view" id="my_view">
<field name="name">my.form</field>
<field name="model">mymodule.my</field>
<field name="arch" type="xml">
<form string="My Form">
<header>
<button name="test_like_1" type="object"
string="Should not appear"
attrs="{'invisible':[('state2','like','measure')]}"
/>
<button name="test_like_2" type="object"
string="Should appear"
attrs="{'invisible':[('state2','not like','measure')]}"
/>
...
State2包含&#39; measure,prelien&#39;,所以我希望第一个按钮是不可见的,第二个按钮是可见的。但是,两者都是看不见的。
我错过了什么?
修改
我运行了我认为Odoo将从该域创建的查询 -
select id, description, state2 from mymodule_my where state2 like '%measure%';
按预期运行,返回记录有&#34;衡量&#34;作为子串。不知何故,这个SQL没有被生成/使用。我的下一步是挖掘Odoo代码&amp;看看发生了什么。
任何人都可以提供有关正在发生的事情的见解吗?
答案 0 :(得分:1)
我发现了问题 - available operators for attrs in a view最好地描述了问题并概述了一个可能的解决方案。要点是在attrs中指定的域在客户端的javascript中进行评估。 '喜欢'&amp; 'ilike'运营商没有实施。
您可以通过查看控制台来验证这一点。就我而言,我收到了大量的警告 -
Unsupported operator ilike in domain [["state2","ilike","measure"]]
我正在考虑按照建议的1扩展odoo / addons / web / static / src / js / framework / data.js中的compute_domain函数,或者只是简单地解决限制。
答案 1 :(得分:0)
你可以尝试
attrs="{'invisible':[('state2','in',['Measure','MEASURE','measure'])]}"
和
attrs="{'invisible':[('state2','not in',['Measure','MEASURE','measure'])]}"
您可能需要在列表中添加更多项目。我不确定是否支持喜欢和不支持,但这是我在其他插件中使用的方法。
答案 2 :(得分:0)
你正在比较字符串'state2'
而不是字段state2
的值,你也应该比较另一种方式,这不是最好的例子,但你应该得到我的的意思。
>>> 'measure,prelien' in 'measure'
False
>>> 'measure' in 'measure,prelien'
True
>>>
第一个条件永远不会评估为真。你应该这样做
定义一个名为default的char字段,并将其默认值设置为'measure'
并将其隐藏在视图中
measure = fields.Char('Measure', default='measure', store=False)
然后你的观点应该是这样的
<field name="measure" invisible="1" />
<button name="test_like_1" type="object"
string="Should not appear"
attrs="{'invisible':[('measure', 'like', state2)]}"
/>
<button name="test_like_2" type="object"
string="Should appear"
attrs="{'invisible':[('measure', 'not like', state2)]}"
/>