OpenERP 无法做到动态更新明细表的下拉列表选择项
-
感谢 digitalsatori 详细回复。按照这个思路,在订单明细列表中试验成功。谢谢!
在没有在本论坛发问之前就下结论说不能,实在惭愧。不过本人确实没有在 addons 代码中找到类似的用法。
而且到现在也没弄明白为什么在明细表中按下向下箭头时能触发 product 的 search 方法,而将明细表中的 product 换成
另一个自定义的表后,按下向下箭头时却不能触发该自定义表的 search 方法。
另外,经过不懈努力,在github 中找到一个对应的模块,能解决供应商限定产品的问题:
https://github.com/eoconsulting/purchase_supplier -
感谢各位指点,此问题已经完满解决。答案就在按下每个下拉列表的向下箭头时,会自动调用对应表的 name_search 方法,在此方法里还可以调用 search 方法,当然也可以不调用。如果不调用 search 方法,就没有必要去覆写它。完整的示例就是上条回复提到的:https://github.com/eoconsulting/purchase_supplier
-
@Kenny 你提到的那个模块好象写得不对啊,这个模块能实现你的要求? 而且这个模块的写法基本上可以说是写OpenERP模块的反面教材。
-
@digitalsatori 这个模块覆写了product 的 name_search 方法,并且用 partner_id 来限定下拉列表中的值,能解决选择问题,但其中大量直接使用 SQL 语句,我并不提倡。
我在这里举这个示例,只是想说明用户在下拉列表中选择前系统会自动调用 name_search 方法,在name_search中再显式调用search方法。
因为我一开始没有注意到在下拉列表中输入时,系统会调用 name_search方法,我以为是调用search方法,其实是在选择下拉列表中“搜索更多...“时系统才会自动调用search方法。
我的代码没有示例中这么复杂(我的代码是解决一个类似问题,并不是由供应商限定产品选择问题),只有如下几句:
def name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=100):
if not args:
args = []
if name:
ids = set()
ids = self.search(cr, user, args + [('name',operator,name)], limit=(limit and (limit-len(ids)) or False) , context=context)
else:
ids = self.search(cr, user, args, limit=limit, context=context)
result = self.name_get(cr, user, ids, context=context)
return result
def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False):
if context is None:
context = {}
if context and context.get('order_id', False):
args.append((('order_id', '=', context['order_id'])))
return super(purchase_order_line, self).search(cr, uid, args, offset=offset, limit=limit, order=order, context=context, count=False)
问题就解决。当然还可以更完美一些。 -
这样是否比较简单: [检测到链接无效,已移除]
-
@digitalsatori 确实很简洁、优雅,佩服!
国外论坛也有很多人问到这个问题,但我没有发现很好的答案。改天我把你这个转国外论坛去,可以吗?
fabien 本人也回答过这个问题,但很简短,老外看完后也一样找不到答案。一个老帖子:<br / http://forum.openerp.com/forum/topic9131.html br />
fabien 的回答是这样的:
Search, in the technical documentation for:
* domain (to apply on the product_id of the purchae order line)
* name_search (to apply on the supplier list on product form)
By using both, it should do the trick.
这个答案对懂的人一看就明白,对不懂的人还是不懂。 -
name_search 对记录搜索的实现最后还是要用到对象的search方法,简单的说name_search就是用来实现模糊查询的方法。比如在product模块里的name_search, 你输入了一个查询字串,OpenERP先去根据“产品编码”搜索,如果搜不到,再把你的字串当条码搜索,还搜不到,再去跟产品编码部分匹配,等等(你完全可以自定义这个name_search方法来适应你自己模糊查询的要求)
欢迎转载