你好其他程序员
在Odoo 8的product.py中,我看到name_search方法将产品名称和变量连接为产品名称。然而,我的产品有数百个属性。
高度:500mm,505mm,...... 3000mm
宽度:500mm,505mm,...... 4000mm
因此,无法搜索所需的变体
所以我需要先选择产品, 然后是高度属性, 然后是宽度属性
理论上我需要覆盖搜索方法
删除产品名称中的变体
创建搜索方法以选择第一个属性
创建另一种搜索方法以选择第二个属性
然后需要将产品名称+ att1 + att2返回到主搜索方法
有人能指出我正确的方向吗?
我的模特 class product_product(models.Model):
_inherit = 'product.product'
def search(self, cr, uid, args, offset=0, limit=None, order=None, context=None, count=False):
if context is None:
context = {}
if context.get('material_id'):
productobj = self.pool.get('product.product').read(cr, uid, context['material_id'],['materialoptions_id'])
args = [('categ_id','=',productobj['materialoptions_id'][0])] + args
return super(product_product, self).search(cr, uid, args, offset, limit, order, context=context, count=count)
product.py
def name_get(self,cr,user,ids,context = None): 如果上下文为None: context = {} if isinstance(ids,(int,long)): ids = [ids] 如果不是len(ids): 返回[]
def _name_get(d):
name = d.get('name','')
code = context.get('display_default_code', True) and d.get('default_code',False) or False
if code:
name = '[%s] %s' % (code,name)
return (d['id'], name)
partner_id = context.get('partner_id', False)
if partner_id:
partner_ids = [partner_id, self.pool['res.partner'].browse(cr, user, partner_id, context=context).commercial_partner_id.id]
else:
partner_ids = []
# all user don't have access to seller and partner
# check access and use superuser
self.check_access_rights(cr, user, "read")
self.check_access_rule(cr, user, ids, "read", context=context)
result = []
for product in self.browse(cr, SUPERUSER_ID, ids, context=context):
variant = ", ".join([v.name for v in product.attribute_value_ids])
name = variant and "%s (%s)" % (product.name, variant) or product.name
sellers = []
if partner_ids:
sellers = filter(lambda x: x.name.id in partner_ids, product.seller_ids)
if sellers:
for s in sellers:
seller_variant = s.product_name and (
variant and "%s (%s)" % (s.product_name, variant) or s.product_name
) or False
mydict = {
'id': product.id,
'name': seller_variant or name,
'default_code': s.product_code or product.default_code,
}
result.append(_name_get(mydict))
else:
mydict = {
'id': product.id,
'name': name,
'default_code': product.default_code,
}
result.append(_name_get(mydict))
return result
答案 0 :(得分:0)
所以我认为最好的“解决方法”就是如果我创建3个自定义字段
产品类型(所选类别中的所有产品名称)
宽度(链接到“产品类型”中所选产品的属性)
高度(链接到“产品类型”中所选产品的属性)
在产品领域之上。然后通过连接这3个值,我可以将上下文“name”传递给产品搜索方法以进行匹配。因此,只显示一个符合上述标准的产品
希望这有助于-me -
为什么这是最好的方法?可能应该添加这个。教育价值,什么不是。
因为,在调试时你会看到产品,它的属性共享一个id。这是因为odoo将每种产品变体视为产品。没有“主要”产品,然后它是儿童变种。它是同一个。
LOOK HERE===================================================
{'lang': 'en_US', 'tz': False, 'uid': 1, 'material_id': 19}
LOOK HERE3===================================================
{'lang': 'en_US', 'tz': False, 'uid': 1, 'material_id': 19}
[33, 34, 35, 36]
LOOK HERE2===================================================
{'default_code': False, 'id': 33, 'name': u'Palisade Fence (Domestic 110mm) (1800, 3000mm)'}
LOOK HERE3===================================================
{'lang': 'en_US', 'tz': False, 'uid': 1, 'material_id': 19}
[33, 34, 35, 36]
LOOK HERE2===================================================
{'default_code': False, 'id': 34, 'name': u'Palisade Fence (Domestic 110mm) (1800, 3005mm)'}
LOOK HERE3===================================================
{'lang': 'en_US', 'tz': False, 'uid': 1, 'material_id': 19}
[33, 34, 35, 36]
LOOK HERE2===================================================
{'default_code': False, 'id': 35, 'name': u'Palisade Fence (Domestic 110mm) (1805, 3000mm)'}
LOOK HERE3===================================================
{'lang': 'en_US', 'tz': False, 'uid': 1, 'material_id': 19}
[33, 34, 35, 36]
这就是为什么每个变体都有自己的物料清单(这正是我需要的,谢谢精彩的odoo开发人员)所以除非你想改变odoo的结构,否则首先需要传递一个上下文来过滤产品,而不是相反
希望这对每个人都有意义。我对编程非常陌生,所以请告诉我,如果我错过了这个情节。
odoo是令人难以置信的谢谢你们