如何在Odoo动作窗口/树视图中设置Many2One字段按名称默认搜索
解决stock.quant视图默认搜索"/Stock"位置的问题
你遇到的错误是因为search_default_location_id参数要求传入仓库位置的整数ID,而不是路径字符串"/Stock",Odoo会把你传入的字符串当成ID去查询数据库,自然触发类型错误。以下是几种可行的实现方案:
方案一:动态获取目标位置ID(推荐,适配多环境)
在自定义动作窗口的context中,通过Odoo的ORM方法动态查询"/Stock"对应的位置ID,避免硬编码ID的局限性。
修改动作窗口的XML配置:
<field name="context" eval="{'search_default_location_id': env['stock.location'].search([('complete_name', '=', '/Stock')], limit=1).id}"/>
- 若"/Stock"是位置的完整路径(比如根仓库的
complete_name字段值),用=精确匹配即可; - 若需要模糊匹配包含"/Stock"的路径,可把
=改成like,比如('complete_name', 'like', '/Stock'),注意确保查询结果唯一,limit=1会取第一个匹配项。
方案二:硬编码位置ID(适合固定环境)
如果你的环境中"/Stock"的ID是固定不变的,可直接传入对应的整数ID(比如假设ID为12):
<field name="context" eval="{'search_default_location_id': 12}"/>
缺点是换环境后ID可能变化,需要重新修改配置。
方案三:直接用domain过滤数据集
如果不需要在搜索栏显示"/Stock"文本,只想打开视图直接显示该位置的库存记录,可直接在动作窗口中设置domain过滤:
<field name="domain" eval="[('location_id.complete_name', '=', '/Stock')]"/>
这种方式会直接过滤stock.quant数据集,打开视图后只展示符合条件的记录,效果和手动搜索一致。
方案四:自定义搜索栏默认显示文本
若希望同时在搜索栏的Location输入框中显示"/Stock"文本,需要继承并修改stock.quant的搜索视图:
<record id="view_stock_quant_search_inherit" model="ir.ui.view"> <field name="name">stock.quant.search.inherit</field> <field name="model">stock.quant</field> <field name="inherit_id" ref="stock.view_stock_quant_search"/> <field name="arch" type="xml"> <field name="location_id" position="attributes"> <attribute name="context">{'search_default_name': '/Stock'}</attribute> </field> </field> </record>
之后确保自定义动作窗口使用这个继承后的搜索视图,打开时就会自动在Location搜索框中填充"/Stock"并执行搜索。
内容的提问来源于stack exchange,提问作者holydragon
相关产品推荐
相关产品推荐

