Odoo9中覆盖库存调拨Reverse按钮权限时元素定位失败求助
解决Odoo库存调拨Reverse按钮权限控制的XPath定位问题
这个问题的核心是XPath表达式无法正确解析%(act_stock_return_picking)d这种Odoo动态动作ID语法,因为%和括号在XPath中会被当作特殊符号处理,导致无法精准匹配父视图里的按钮元素。
解决方案:换一种定位方式
你可以通过按钮的固定属性(比如string)或者模糊匹配name属性的部分内容来定位,避开动态语法的冲突。
方法1:通过string属性定位(推荐)
因为按钮的显示文本Reverse是固定的,直接用这个属性匹配更可靠:
<?xml version="1.0" encoding="utf-8"?> <openerp> <data> <record id="view_picking_form_extend" model="ir.ui.view"> <field name="name">stock.picking.form.extend</field> <field name="model">stock.picking</field> <field name="inherit_id" ref="stock.view_picking_form"/> <field name="arch" type="xml"> <!-- 通过string属性定位Reverse按钮 --> <xpath expr="/form/header/button[@string='Reverse' and @states='done']" position="replace"> <button name="%(act_stock_return_picking)d" string="Reverse" states="done" type="action" groups="stock.group_stock_manager"/> </xpath> </field> </record> </data> </openerp>
方法2:通过contains模糊匹配name属性
如果担心string属性可能被其他视图修改,也可以用contains匹配name属性里的动作标识:
<xpath expr="/form/header/button[contains(@name, 'act_stock_return_picking') and @states='done']" position="replace"> <button name="%(act_stock_return_picking)d" string="Reverse" states="done" type="action" groups="stock.group_stock_manager"/> </xpath>
为什么原来的写法不行?
%(act_stock_return_picking)d是Odoo特有的动态语法,用于在视图中动态解析动作的数据库ID。当你把这个字符串直接写在XPath的@name='xxx'匹配条件里时,XPath解析器会把%和括号当作自身语法的一部分(比如格式化符号、表达式分组),而不是作为属性值的原始内容去匹配父视图里的按钮,自然就找不到对应的元素了。
而那些不带%和d的按钮,name属性是静态字符串,XPath可以直接精准匹配,所以不会报错。
内容的提问来源于stack exchange,提问作者MouTio
相关产品推荐
相关产品推荐

