You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:21:12