有条件地隐藏按钮 openerp/odoo
conditionally hide a button openerp/odoo
我有一个按钮,只有当用户是超级用户(管理员)时我才需要显示它。我的问题是,当我使用 xpath 来包含 attrs 时,没有任何东西按预期工作。我的代码是:
<record id="wms_stock_view_move_form" model="ir.ui.view">
<field name="name">wms.stock.view.move.form</field>
<field name="model">stock.move</field>
<field name="inherit_id" ref="stock.view_move_form" />
<field name="arch" type="xml">
<field name="location_id" position="attributes">
<attribute name="domain">[('name','!=', 'Scrapped')]</attribute>
</field>
<field name="location_id" position="after">
<field name="is_superuser"/>
</field>
<field name="location_dest_id" position="attributes">
<attribute name="domain">[('name','!=', 'Scrapped')]</attribute>
</field>
<xpath expr='//form[@string="Stock Moves"]' position='attributes'>
<attribute name="create">false</attribute>
<attribute name="edit">false</attribute>
<attribute name="delete">false</attribute>
</xpath>
<xpath expr="//button[@name='action_cancel']" position="attributes">
<attribute name="attrs">{'invisible':[('is_superuser','=', True)]}</attribute>
</xpath>
</field>
</record>
这里,is_superuser是一个计算域,它的代码是:
is_superuser = fields.Boolean(compute='_is_super_user')
def _is_super_user(self):
if self._uid == SUPERUSER_ID:
self.is_superuser = True
else:
self.is_superuser = False
按钮的原始代码,在其原始视图中是:
<button name="action_cancel" states="draft,assigned,confirmed" string="Cancel Move" type="object"/>
知道吗,我做错了什么?提前致谢。
对于此类行为,我更愿意使用 Odoo 的群组访问系统。只需使用属性 groups
扩展按钮,当然还有正确的组(例如 base.group_system
或 base.group_no_one
用于管理员):
<field name="action_cancel" states="draft,assigned,confirmed" position="attributes">
<attribute name="groups">base.group_system</attribute>
</field>
您使用的代码应该有效:
首先,您需要将 @api.depends()
放在方法定义上,而不放置任何字段,以便每次调用记录时都会计算它。
其次检查计算字段的结果,因为 xml 代码是正确的,所以它按预期工作
非常感谢您的帮助,但以上回复对我没有帮助。但是,我找到了这个问题的答案。因为它包含状态,所以我们也需要考虑到这一点。我们还需要覆盖 'states' 标签的行为。所以代码需要是:
<xpath expr="//button[@name='action_cancel']" position="attributes">
<attribute name="states"></attribute>
<attribute name="attrs">{'invisible':['|', ('is_superuser','=', False), ('state', 'not in', ('draft','assigned','confirmed'))]}</attribute>
</xpath>
我有一个按钮,只有当用户是超级用户(管理员)时我才需要显示它。我的问题是,当我使用 xpath 来包含 attrs 时,没有任何东西按预期工作。我的代码是:
<record id="wms_stock_view_move_form" model="ir.ui.view">
<field name="name">wms.stock.view.move.form</field>
<field name="model">stock.move</field>
<field name="inherit_id" ref="stock.view_move_form" />
<field name="arch" type="xml">
<field name="location_id" position="attributes">
<attribute name="domain">[('name','!=', 'Scrapped')]</attribute>
</field>
<field name="location_id" position="after">
<field name="is_superuser"/>
</field>
<field name="location_dest_id" position="attributes">
<attribute name="domain">[('name','!=', 'Scrapped')]</attribute>
</field>
<xpath expr='//form[@string="Stock Moves"]' position='attributes'>
<attribute name="create">false</attribute>
<attribute name="edit">false</attribute>
<attribute name="delete">false</attribute>
</xpath>
<xpath expr="//button[@name='action_cancel']" position="attributes">
<attribute name="attrs">{'invisible':[('is_superuser','=', True)]}</attribute>
</xpath>
</field>
</record>
这里,is_superuser是一个计算域,它的代码是:
is_superuser = fields.Boolean(compute='_is_super_user')
def _is_super_user(self):
if self._uid == SUPERUSER_ID:
self.is_superuser = True
else:
self.is_superuser = False
按钮的原始代码,在其原始视图中是:
<button name="action_cancel" states="draft,assigned,confirmed" string="Cancel Move" type="object"/>
知道吗,我做错了什么?提前致谢。
对于此类行为,我更愿意使用 Odoo 的群组访问系统。只需使用属性 groups
扩展按钮,当然还有正确的组(例如 base.group_system
或 base.group_no_one
用于管理员):
<field name="action_cancel" states="draft,assigned,confirmed" position="attributes">
<attribute name="groups">base.group_system</attribute>
</field>
您使用的代码应该有效:
首先,您需要将 @api.depends()
放在方法定义上,而不放置任何字段,以便每次调用记录时都会计算它。
其次检查计算字段的结果,因为 xml 代码是正确的,所以它按预期工作
非常感谢您的帮助,但以上回复对我没有帮助。但是,我找到了这个问题的答案。因为它包含状态,所以我们也需要考虑到这一点。我们还需要覆盖 'states' 标签的行为。所以代码需要是:
<xpath expr="//button[@name='action_cancel']" position="attributes">
<attribute name="states"></attribute>
<attribute name="attrs">{'invisible':['|', ('is_superuser','=', False), ('state', 'not in', ('draft','assigned','confirmed'))]}</attribute>
</xpath>