动态填充下拉列表

0 投票
2 回答
2438 浏览
提问于 2025-04-18 05:57

我正在尝试在OpenERP中根据一个下拉列表(DDL)的值来填充另一个下拉列表。下面是我尝试过的代码。

这是我的视图XML:

<h1>
    <label for="categ1" string="Parent category"/>
         <field name="categ1" on_change="Product_Category_OnChange(categ1)" />
</h1>
<newline/>
<h1> 
    <label for="my_products" string="Products" /> 
         <field name="my_products" />
</h1>

我这个视图的_columns部分是这样的:

_columns = {
     'categ1':fields.many2one('product.category','Parent Category',required=True),
     'my_products':fields.many2one('product.product','Products')
}

我的onchange函数是这样的:

def Product_Category_OnChange(self,cr,uid,ids,categ1):
    pro_id={}
    cr.execute('select ... where parent_id='+str(categ1))
    res = cr.fetchall()
    for i in range(len(res)):
            pro_id[i]=res[i]
    return {'domain':{'my_products': pro_id}}

问题是,我没有得到过滤后的my_products的值,而是得到了my_products中所有的值。请告诉我,我哪里做错了,或者指引我正确的方向。谢谢!

2 个回答

0

就像这样。这在我这边可以用。

{'domain':{'my_products':[('id','=',categ1)]}}

语法是这样的,

def Product_Category_OnChange(self,cr,uid,ids,categ1, context=None):
        pro_id={}
        product_obj = self.pool.get('product.category')
        print product_obj.browse(cr, uid, categ1)
        cr.execute('select * from product_category where parent_id='+str(categ1))
        res = cr.fetchall()
        for i in range(len(res)):
            pro_id[i]=res[i]
        return {'domain':{'my_products':[('id','=',categ1)]}}

更新:

我明白了,首先,你需要创建一个自定义模块。

把以下代码放到你的 .py 文件里。

class product(osv.osv):
    _inherit = 'product.product'

    def name_get(self, cr, uid, ids, context=None):
        res = []
        cr.execute('select ... where parent_id='+str(ids[0]))
        resource = cr.fetchall()
        for r in resource:
            res.append((r.id, r.name)) # My assumption
        return res

看看这个 http://bazaar.launchpad.net/~openerp/openobject-addons/trunk/view/head:/product/product.py#L778

希望这能帮到你。

1

我觉得你想要展示的只是属于那个类别的产品。

def Product_Category_OnChange(self,cr,uid,ids,categ1, context=None):
    pro_id={}
    product_obj = self.pool.get('product.category')
    if not categ1:return {}
    categ_obj = product_obj.browse(cr, uid, categ1)

    return {'domain':{'my_products':[('categ_id','=',categ_obj.id)]}}

或者用xml格式来表示

<field name="my_products" domain="[('categ_id','=',categ1)]" />

撰写回答