Odoo 10隐藏销售模块按钮报错求助:Argument must be bytes or unicode
看起来你在尝试继承销售订单视图来隐藏"Create Invoice"按钮时遇到了解析错误,这个问题的核心原因通常是XPath定位元素时无法正确解析动态的action引用,或是模块依赖配置缺失导致action ID无法被系统识别。
错误原因分析
你原代码里用@name='%(sale.action_view_sale_advance_payment_inv)d'定位按钮,但这种动态替换语法在XPath解析阶段还未被Odoo处理,系统找不到对应的按钮元素,进而抛出NoneType相关的错误。另外,如果你的自定义模块没有正确依赖sale模块,sale.action_view_sale_advance_payment_inv这个action ID也无法被正确解析。
解决方案
1. 使用更稳定的按钮定位方式(推荐)
放弃动态的name属性定位,改用按钮的string属性(显示文本)来匹配,因为这个文本通常不会轻易变更,定位更可靠:
<record id="custom_sale_order_form_inherit" model="ir.ui.view"> <field name="name">sale.order.form.custom.inherit</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <xpath expr="//header/button[@string='Create Invoice']" position="attributes"> <attribute name="invisible">1</attribute> </xpath> </field> </record>
2. 确保模块依赖正确配置
如果坚持要用name属性定位,首先要在自定义模块的__manifest__.py中添加sale模块的依赖:
{ # ...其他配置项 'depends': ['sale'], # ...其他配置项 }
之后可以尝试直接用action的XML ID定位(去掉动态替换语法):
<xpath expr="//header/button[@name='sale.action_view_sale_advance_payment_inv']" position="attributes"> <attribute name="invisible">1</attribute> </xpath>
不过这种方式不如string定位稳定,因为action的XML ID理论上存在被修改的可能(虽然概率极低)。
3. 验证XPath路径准确性
确认你的XPath路径是否精准,原按钮确实在视图的header节点下。如果视图结构有嵌套,可能需要调整路径为//form/header/button来更精准匹配。
测试建议
修改代码后,重启Odoo服务并更新模块,然后打开销售订单视图查看按钮是否被成功隐藏。如果仍有问题,可以开启Odoo调试模式,进入设置 > 技术 > 用户界面 > 视图,找到销售订单的原始视图,检查按钮的具体属性,确保你的XPath能精准匹配目标元素。
内容的提问来源于stack exchange,提问作者Tessnim

